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

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

  • 相关阅读:
    VLOOKUP函数的使用方法(进阶篇)
    VLOOKUP函数的使用方法(初级篇)
    VLOOKUP函数的使用方法(入门级)
    Linq in查询
    JS,Jquery,Ajax,Json,Xml,Html,CSS帮助文档
    发布网站到IIS
    SQL小问题总结
    SQLHelper
    table显示内边框
    迷茫的生活
  • 原文地址:https://www.cnblogs.com/fly_zj/p/3034500.html
Copyright © 2011-2022 走看看