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

相关文章
相关标签/搜索