小编给大家分享一下SQL Server 2008处理隐式数据类型转换的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

通过如下测试验证,首先建立数据分布不平均的测试表。

USEtempdbGOCREATETABLE_t(cvarchar(50));CREATEINDEXIX_cON_t(c);GO--加入10000条数据INSERT_tSELECT(9999+id)FROM(SELECTTOP10000id=ROW_NUMBER()OVER(ORDERBYGETDATE())FROMsys.all_columnsa,sys.all_columns)ID--将100-10000的数据变成相同值UPDATE_tSETc=''WHEREc>='10100'

然后通过 varhcar和nvarchar值分别测试满足条件1条和满足条件8900条的执行计划预估行数。

ALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGOSELECT*FROM_tWHEREc='10005';--实际1条GOSETSHOWPLAN_ALLOFF;GOALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGOSELECT*FROM_tWHEREc=N'10005';--实际1条GOSETSHOWPLAN_ALLOFF;GOALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGOSELECT*FROM_tWHEREc='';--实际9900条GOSETSHOWPLAN_ALLOFF;GOALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGOSELECT*FROM_tWHEREc=N'';--实际9900条GOSETSHOWPLAN_ALLOFF;GO

得到的查询计划预估行数如下图所示

从图中显示的预估数据行数可以看到,对于varchar值(不需要隐匿的数据类型转换),其预估的结果是准确的。但对于nvarchar值,不管指定的值是只有一条数据,还是有8900条数据匹配,其预估的结果都是99.0099,这说明预估并没有考虑我们指定的值。
进一步用变量测试

ALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGODECLARE@vvarchar;SELECT*FROM_tWHEREc=@v;--varcharGOSETSHOWPLAN_ALLOFF;GOALTERINDEXIX_cON_tREBUILD;GOSETSHOWPLAN_ALLONGODECLARE@nvnvarchar;SELECT*FROM_tWHEREc=@nv;--nvarcharGOSETSHOWPLAN_ALLOFF;GO

结果如下图所示:

不管是varchar,还是nvarchar的变量,预估的行数都是99.0099,这个值与使用nvarchar常量值的结果一样,看来SQL Server查询优化器应该确实把 GetRangeThroughConvert 的结果看成变量了,这个应该是设计上考虑不太周全的地方了,毕竟指定固定常量值的时候,GetRangeThroughConvert的结果应该也是确定值才对。

以上是“SQL Server 2008处理隐式数据类型转换的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!