在 SQL Server 中無論是在 WHERE 或是 JOIN ON 用來做為條件的參數「型態」,最好要一模一樣,今天早上就遇到了一個跑到不良執行計劃的案例。
Y.ID 跟 nrs.NxxxId,一個是 INT,一個 BIGINT,當我不針對 Y.ID 強制轉型為 BIGINT 時,可以看到它實際資料列數目高達 281114202 筆,比我家電話號碼還長,把 Y.ID 強制轉型為 BIGINT 之後,實際資料列數目降到 84027。
總結來說,SQL Server 的資料欄位型態是需要嚴謹的定義,不能把可以相容的兩種欄位型態看成是一樣的,像是 varchar、nvarchar 也很容易被當成是同種類的型態拿來做條件比較,執行計劃產生器可不這樣認為,所以拿來當成條件的欄位型態最好一定要一模一樣。
最後附上 varchar、nvarchar 的案例:https://dotblogs.com.tw/supershowwei/2019/08/12/232213
Search