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

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

原文地址:https://www.cnblogs.com/fly_zj/p/3034500.html