• ADADADADAD

    SQL Server 2008处理隐式数据类型转换的示例分析[ mysql数据库 ]

    mysql数据库 时间:2024-11-28 13:02:04

    作者:文/会员上传

    简介:

    通过如下测试验证,首先建立数据分布不平均的测试表。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的结果应该也是确定值才对。

    SQL Server 2008处理隐式数据类型转换的示例分析.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: sqlserver