SQL Server 2008 处理隐式数据类型转换在执行计划中的增强
通过如下测试验证,首先建立数据分布不平均的测试表。
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 -- 将 100 - 10000 的数据变成相同值UPDATE _t SET c = '' WHERE c >= '10100'
然后通过 varhcar和nvarchar值分别测试满足条件1条和满足条件8900条的执行计划预估行数。
ALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = '10005'; -- 实际1条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = N'10005'; -- 实际1条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = ''; -- 实际9900条GOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGOSELECT * FROM _t WHERE c = N''; -- 实际9900条GOSET SHOWPLAN_ALL OFF;GO
得到的查询计划预估行数如下图所示
从图中显示的预估数据行数可以看到,对于varchar值(不需要隐匿的数据类型转换),其预估的结果是准确的。但对于nvarchar值,不管指定的值是只有一条数据,还是有8900条数据匹配,其预估的结果都是99.0099,这说明预估并没有考虑我们指定的值。
进一步用变量测试
ALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGODECLARE @v varchar;SELECT * FROM _t WHERE c = @v; -- varcharGOSET SHOWPLAN_ALL OFF;GOALTER INDEX IX_c ON _t REBUILD;GOSET SHOWPLAN_ALL ONGODECLARE @nv nvarchar;SELECT * FROM _t WHERE c = @nv; -- nvarcharGOSET SHOWPLAN_ALL OFF;GO
结果如下图所示:
不管是varchar,还是nvarchar的变量,预估的行数都是99.0099,这个值与使用nvarchar常量值的结果一样,看来SQL Server查询优化器应该确实把 GetRangeThroughConvert 的结果看成变量了,这个应该是设计上考虑不太周全的地方了,毕竟指定固定常量值的时候,GetRangeThroughConvert的结果应该也是确定值才对。
本文讲解了SQL Server的相关内容,更多相关内容请关注php中文网。
相关推荐:
以上是SQL Server 2008 处理隐式数据类型转换在执行计划中的增强的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

microsoft sql server是Microsoft公司推出的关系型数据库管理系统,是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理,具有使用方便可伸缩性好与相关软件集成程度高等优点。SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。

SQLServer还是MySQL?最新研究揭秘最佳数据库选择近年来,随着互联网和大数据的快速发展,数据库的选择成为了企业和开发者们面临的一个重要问题。在众多数据库中,SQLServer和MySQL作为两个最为常见和广泛使用的关系型数据库,备受争议。那么,在SQLServer和MySQL之间,到底应该选择哪一个呢?最新的研究为我们揭示了这个问题。首先,让

随着互联网的普及,网站和应用程序的开发成为了许多企业和个人的主要业务。而PHP和SQLServer数据库则是其中非常重要的两个工具。PHP是一种服务器端脚本语言,可以用于开发动态网站;SQLServer是微软公司开发的关系型数据库管理系统,具有广泛的应用场景。在本文中,我们将讨论PHP和SQLServer的开发,以及它们的优缺点和应用方法。首先,让我们

如何使用PDO连接到MicrosoftSQLServer数据库介绍:PDO(PHPDataObjects)是PHP提供的一个访问数据库的统一接口。它提供了许多优点,比如实现了数据库的抽象层,可以方便地切换不同的数据库类型,而不需要修改大量的代码。本文将介绍如何使用PDO连接到MicrosoftSQLServer数据库,并提供一些相关代码示例。步骤

在Web开发中,PHP与MySQL的结合是非常常见的。但是,在某些情况下,我们需要连接其他类型的数据库,例如SQL Server。在本文中,我们将介绍使用PHP连接SQL Server的五种不同方法。

SQLServer与MySQL对比:哪个数据库更适合高可用性架构?在当今的数据驱动世界中,高可用性是构建可靠和稳定系统的必要条件之一。数据库作为数据存储和管理的核心组件,其高可用性对于企业的业务运转至关重要。在众多的数据库中,SQLServer和MySQL是常见的选择。那么在高可用性架构方面,究竟哪个数据库更适合呢?本文将对二者进行对比,并给出一些建议。

SQLServer和MySQL是目前两个非常流行的关系型数据库管理系统(RDBMS)。它们都是用于存储和管理大规模数据的强大工具。然而,它们在处理大规模数据时有一些不同之处。本文将对SQLServer和MySQL进行比较,重点是它们在大规模数据处理方面的适用性。首先,让我们来了解一下SQLServer和MySQL的基本特点。SQLServer是由微软

随着互联网的不断发展,数据库的选择愈发重要。在众多的数据库中,SQLServer和MySQL是两个备受瞩目的选项。SQLServer是微软公司开发的关系型数据库管理系统,而MySQL则是一种开源的关系型数据库管理系统。那么在SQLServer和MySQL之间如何选择最佳的数据库方案呢?首先,我们可以从性能方面比较这两个数据库。SQLServer在处理
