也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)
在上一篇文章也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表。评估的数据行数与实际值有非常大出入的问题,进一步測试之后。我发现这种评估不准确性应该确实与推測的一样,它使用了变量的评估方式。
通过例如以下測试验证。首先建立数据分布不平均的測试表。
USE tempdb
GO
CREATE TABLE _t(
    c varchar(50)
);
CREATE INDEX IX_c ON _t( c );
GO
-- 添加 10000 条数据
INSERT _t
SELECT (9999 + id) FROM(
    SELECT TOP 10000 id = ROW_NUMBER() OVER( ORDER BY GETDATE() )
    FROM sys.all_columns a, sys.all_columns
)ID
-- 将 100 - 10000 的数据变成同样值
UPDATE _t SET c = '' WHERE c >= '10100'
然后通过 varhcar和nvarchar值分别測试满足条件1条和满足条件8900条的运行计划预估行数。
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
SELECT * FROM _t WHERE c = '10005';     -- 实际1条
GO
SET SHOWPLAN_ALL OFF;
GO
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
SELECT * FROM _t WHERE c = N'10005';     -- 实际1条
GO
SET SHOWPLAN_ALL OFF;
GO
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
SELECT * FROM _t WHERE c = '';          -- 实际9900条
GO
SET SHOWPLAN_ALL OFF;
GO
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
SELECT * FROM _t WHERE c = N'';         -- 实际9900条
GO
SET SHOWPLAN_ALL OFF;
GO
得到的查询计划预估行数例如以下图所看到的 
 
从图中显示的预估数据行数能够看到,对于varchar值(不须要隐匿的数据类型转换)。其预估的结果是准确的。但对于nvarchar值,无论指定的值是仅仅有一条数据。还是有8900条数据匹配。其预估的结果都是99.0099,这说明预估并没有考虑我们指定的值。 
进一步用变量測试
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
DECLARE @v varchar;SELECT * FROM _t WHERE c = @v; -- varchar
GO
SET SHOWPLAN_ALL OFF;
GO
ALTER INDEX IX_c ON _t REBUILD;
GO
SET SHOWPLAN_ALL ON
GO
DECLARE @nv nvarchar;SELECT * FROM _t WHERE c = @nv; -- nvarchar
GO
SET SHOWPLAN_ALL OFF;
GO
结果例如以下图所看到的: 
无论是varchar,还是nvarchar的变量,预估的行数都是99.0099。这个值与使用nvarchar常量值的结果一样,看来SQL Server查询优化器应该确实把 GetRangeThroughConvert 的结果看成变量了。这个应该是设计上考虑不太周全的地方了,毕竟指定固定常量值的时候。GetRangeThroughConvert的结果应该也是确定值才对。(这个问题在 SQL Server 2014中看起来是调整过来了,在2014中測试没有发现这种现象)。
也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)的更多相关文章
- SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据
		
原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...
 - SQL Server 2000向SQL Server 2008 R2推送数据
		
[文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...
 - Sql Server函数全解<三>数据类型转换函数和文本图像函数
		
阅读目录 一:数据类型转换函数 二:文本和图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和flo ...
 - Sql Server函数全解(三)数据类型转换函数和文本图像函数
		
一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...
 - SQL Server 2008如何导出带数据的脚本文件
		
第一步,选中需要导出脚本的数据库,右键选中 第二步,选取弹出菜单中的任务-生成脚本选项(会弹出一SQL生成脚本的向导) 第三步,在向导中点击下一步,弹出选择数据库界面(默认是自己之前选中的数据库),把 ...
 - SQL Server 2008复制发布订阅(数据同步)
		
数据库同步问题 1.有一台主数据库服务器A和另外一台数据库服务器B,客户端首先访问数据库B,当B数据库服务器挂掉时就访问A,当对数据库B进行DML操作时,同时对A进行更新,如果A与B之间通讯失败,则将 ...
 - SQL Server 2008 R2没有卸载干净
		
在卸载Microsoft SQL Server 2008 R2 安装程序(简体中文) 出现 :“警告 26003.无法卸载 Microsoft SQL Server 2008 R2 安装程序支持文件, ...
 - 【问题&解决】试用版SQL Server 2008 R2 提示评估期已过,数据库不能访问解决办法
		
因为以前一直是试用版,重启服务器之后,突然数据库不能访问,提示评估期已过,都快吓死了.还好找到了解决办法特copy解决步骤如下: (笔者用的是企业版: R88PF-GMCFT-KM2KR-4R7GB- ...
 - SQL Server 2008 R2导出数据脚本的方法
		
以前看到有些朋友说必须SQL Server 2008才能导出包含数据的脚本,后来仔细研究发现其实SQL Server 2008 R2也是可以的,只需在导出的时候在高级中设置一下即可. 1.首先在数据库 ...
 
随机推荐
- 【13】vuex2.0 之 state
			
Vuex 的核心是 store, 它是一个通过 Vuex.Store 构造函数生成的对象.为什么它会是核心呢?因为我们调用这个构造函数创建store 对象的时候,给它传递参数中包装了state, mu ...
 - JAVA神操作--使用Arthas线上热更新实战
			
热更不规范,同事两行泪 背景 C君是一个javaer,最近在开发用户登出接口的时候,不小心把接口参数拼错了 正确的是: /api/v1/user/logout?referrer=www.javaer. ...
 - 命名参数和可选参数在.NET中的使用
			
原文发布时间为:2011-04-25 -- 来源于本人的百度文章 [由搬家工具导入] Named and Optional Arguments class NamedExample{staticvoi ...
 - 让Dropdownlist既有静态项又有动态项或者既能有编辑项又能绑定数据源
			
原文发布时间为:2008-10-27 -- 来源于本人的百度文章 [由搬家工具导入] protected void Page_Load(object sender, EventArgs e) //Dr ...
 - onCreate、onStart、onResume、onPause、onStop、onDestory(转)
			
程序正常启动:onCreate()->onStart()->onResume();正常退出:onPause()->onStop()->onDestory() 一个Activit ...
 - input上报流程分析【转】
			
转自:http://blog.chinaunix.net/uid-28320320-id-3389196.html .参考文章 [Andorid]input系统的事件处理 .源码分析 linux )查 ...
 - 10.1综合强化刷题 Day2 morning
			
一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有 ...
 - 身份识别协议枚举工具ident-user-enum
			
身份识别协议枚举工具ident-user-enum 身份识别协议(Ident protocol,IDENT)是一种Internet协议,用于识别使用特定TCP端口的用户身份.服务器开启该服务后,会 ...
 - Maven在[INFO] Generating project in Interactive mode卡住的问题解决
			
我的环境: Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven ...
 - sql server book
			
http://www.sqlpassion.at/blog/ http://www.sqlservercentral.com/Books/