# Timeout expired. & OPTION (MAXDOP 1) ###### tags: `小蟲子` `資料庫` ## 參考 * [[SQL]為什麼 Select 出很少的資料,卻使用 平行處理? - 亂馬客](https://dotblogs.com.tw/rainmaker/2016/05/23/154835) * [MAXDOP <integer_value> - MSDN](https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-ver15#maxdop-integer_value) ## 環境 > 開發端 > * Windows 10 > * Visual Studio 2022 > * .Net 6 > * Dapper > 資料庫 > * Microsoft SQL Server Enterprise: Core-based Licensing (64-bit) > * Microsoft Windows NT 6.3 (9600) > * 版本 12.0.6433.1 ## 錯誤訊息 > Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ## 說明 在寫程式的過程中,正在測試的程式忽然卡在一段沒有修改的部分,這個部分動作就只是到 MS 資料庫撈資料而已(約400萬筆),實際在 SSMS 上大約需要 15 秒,但在程式中卻會 Timeout。 經過排查程式端都沒有異動,回復到先前版本一樣會卡在查詢,所以請 DBA 協助確認資料庫端,DBA 發現是查詢時資料庫端顯示平行處理一直在等待的關係。 也許是頻繁測試的查詢使得查詢計畫有改變(?),所以才會有忽然無法正常查詢的問題。 ## 解決方式 在 SQL 的最後加上 ```sql! OPTION (MAXDOP 1) ``` 強制讓這段 SQL 不使用平行處理 ## 延伸 除了 SQL 端可以強制指定不使用平行處理外,Server 端也有相關設定。 > 資料庫物件總管 → 資料庫(右鍵) → 屬性 → 進階 → 平行處理原則 ### 平行處理原則的成本臨界值 ([cost threshold for parallelism](https://learn.microsoft.com/zh-tw/previous-versions/sql/sql-server-2008-r2/ms188603(v=sql.105)?redirectedfrom=MSDN)) 預設是5秒,唯有執行同一查詢的序列計畫的估計成本高於 cost threshold for parallelism 中設定的值時,SQL Server 才會建立及執行查詢的平行計畫。成本是指在特定硬體組態下,執行序列計畫所需估計的經過時間 (以秒為單位)。 ### 平行處理原則的最大程度 ([max degree of parallelism](https://learn.microsoft.com/zh-tw/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-ver16&redirectedfrom=MSDN&viewFallbackFrom=sql-server-2014)) 每個SQL最多可用的CPU數,預設是0表示沒限制,可以指定數量來限制執行平行計畫所用的處理器數目。