zoukankan      html  css  js  c++  java
  • 在sqlserver中,优化器如何利用统计信息来估算返回的行数(二)

    如果在TSQL中使用临时变量,优化器又是如何来评估行数的?

    dbcc FreeProcCache
    declare @dt datetime='2006-04-26 11:44:30.217'
    select * from dbo.DatabaseLog 
    where PostTime=@dt
    OPTION
    (
        QUERYTRACEON 3604,
        QUERYTRACEON 9292,
        QUERYTRACEON 9204
    )

    使用 dbcc FreeProcCache是为了让优化器每次执行时都重新生成执行计划,同样也会使用到postTime上的统计信息

    image

    而该TSQL执行时预估的行数为:

    image

    这个行数是怎么计算出来的呢?

    image

    这个时候预估的行数就不是使用直方图里数据,而是使用密度*行数得到的

    密度=1/select (distinct column) from tabname

    而该列PostTime 的密度为 0.003174603*389=1.234920,即为预估的行数。

    在TSQL中,只要是where语句中的字段或者是 on 中的字段,上面自动或手动新建的统计信息都会被使用到,

    即使是唯一索引,根据元信息就可以判断只返回一条,优化器也会加载唯一索引上的统计信息,来

    生成相应的执行计划。大家可以使用 option() 选项可以查明。

    总结:在使用临时变量时,优化器是根据密度*行数来推断出平均的返回行数,据此生成执行计划!

  • 相关阅读:
    mysql 查询每个分组前N条记录
    MLlib 卡方检验
    还好,我还在路上
    从浏览器渲染原理,浅谈回流重绘与性能优化
    基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件
    Vue2.0结合webuploader实现文件分片上传
    在Vue2.0中集成UEditor 富文本编辑器
    深入研究-webkit-overflow-scrolling:touch及ios滚动
    JS对象的截取和合并
    CSS变量--CSS和JavaScript的桥梁
  • 原文地址:https://www.cnblogs.com/fly_zj/p/3034500.html
Copyright © 2011-2022 走看看