在 SQL Server 查詢中,不經意思的隱匿數據類型轉換可能致使極大的查詢性能問題,好比一個看起來沒有任何問題簡單的條件:WHERE c = N’x’ ,若是 c 的數據類型是 varchar,而且表中包含大量的數據,這個查詢可能致使極大的性能開銷,由於這個操做會致使列 c 的數據類型轉換爲 nvarchar與常量值匹配,在 SQL Server 2008 及以後的版本中,這種操做作了加強,必定程度上下降了性能開銷,參考SQL Server 2008 處理隱式數據類型轉換在執行計劃中的加強 。性能
不過在實際應用中發現,這種加強有時候彷佛沒有起到做用,仍是會存在很大的性能問題。 測試
最近找時間作了一個測試,找出了一種可能的問題。ui
1. 建立一個測試表code
USE tempdb GOCREATE TABLE _t( c varchar(50) );CREATE INDEX IX_c ON _t( c );GO-- 加入 10000 條數據INSERT _tSELECT (9999 + id) FROM( SELECT TOP 10000 id = ROW_NUMBER() OVER( ORDER BY GETDATE() ) FROM sys.all_columns a, sys.all_columns )ID
2. 經過執行計劃看下查詢計劃blog
-- Rebuild索引,確保無索引碎片和統計信息準確 ALTER INDEX IX_c ON _t REBUILD;GO SET SHOWPLAN_ALL ON GO SELECT * FROM _t WHERE c = N'10005b'; GO SET SHOWPLAN_ALL OFF;
注意EstimateRows列,該列值爲1,表示評估的知足條件的數據是1條,如今看起來一切正常 。索引
3.把數據變一下,將大量數據變成相同值數據類型
-- 將 5000 條數據值變成同樣,重建索引以後從新測試 UPDATE _t SET c = '15000' WHERE c >= '15000' ALTER INDEX IX_c ON _t REBUILD; GO SET SHOWPLAN_ALL ON GO SELECT * FROM _t WHERE c = N'10005'; GO SET SHOWPLAN_ALL OFF;
而後咱們發現評估的記錄數變大了im