# 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表示沒限制,可以指定數量來限制執行平行計畫所用的處理器數目。