SQL Server 2008處理隱式數據類型轉換在執行計劃中的加強

在 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條,如今看起來一切正常 。索引

a50cf792c54dc148cdab42478cef7ecd97c5bc63

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

相關文章
相關標籤/搜索