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() 选项可以查明。

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

  • 相关阅读:
    解释*args和**kwargs的含义
    字典推导式创建字典
    返回json格式数据乱码
    DataTables warning: table id=data-table
    echart折线图,柱状图,饼图设置颜色
    No mapping found for HTTP request with URI
    [Err] 1111
    echart提示框内容数据添加单位
    rg.apache.ibatis.binding.BindingException: Mapper method 'com.dao.Cameao.getOnlineDayRation attempted to return null from a method with a primitive return type (float)
    bootstrap datarangepicker如何使用
  • 原文地址:https://www.cnblogs.com/fly_zj/p/3034500.html
Copyright © 2011-2022 走看看