12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-11-28 13:02:04
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
通过如下测试验证,首先建立数据分布不平均的测试表。USEtempdbGOCREATETABLE_t(cvarchar(50));CREATEINDEXIX_cON_t(c);GO--加入10000条数据INSERT_tSELECT(9999+id)FROM(SEL
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
通过如下测试验证,首先建立数据分布不平均的测试表。
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的结果应该也是确定值才对。
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19