JOIN條件中字段類型不一致, 導致索引失效的案例一則

T-SQL如下:

select T1.sno from [MAY_BLACKFISH].dbo.MVS_PARTS_LOG T1 join (
select top 5 sno from Z_result order by sno
) T2 on T1.sno=T2.sno
where T1.TypeName='LCM'

其中MVS_PARTS_LOG爲KW級TABLE, Z_result 只有幾百筆記錄;相關索引都已經建立。

 

調試的時候發現一點很奇怪, 當把top 5 改成top 4, 則一切OK, 1秒內完成查詢;恢復成top 5時則幾十秒還沒出結果。

比對兩者執行計劃,一致的。

細看執行計劃, 發現有一個convert(char(12),...的轉換, 原來這裏JOIN條件中T1.sno是char(12), 而T2.sno是nvarchar(12), MSSQL強制加了一個convert轉換, 導致on條件不能滿足SARG的形式。

將Z_result的sno也改成char(12)後, 問題解決。

 

關於索引, 以及SARG的形式可以參考http://blog.csdn.net/lewisshi/archive/2009/01/13/3765153.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章