优化器根据开消确定选择哪个执行计划,开消又与行数统计信息有关,默认情况下统计信息是在优化的过程中自动生成的。
一旦列被标记为需要统计信息,查询优化器就会查找该列以有的统计信息,如果以有一个统计信息,下一步就会对它进行,检查
以确定它足够新。如果过期就重建统计信息。(由此可见统计信息是基于列的)。
--------------------------------------------------------------------------------------------------------------------------------
在数据库中自动创建统计信息的选项默认开启:
alter database .... set auto_create_statistics {on | off};
alter database .... set auto_update_statistics {on | off};
如果系统的自动创建被禁用,查询会输出一条警告。在这个模式下DBA 要保证统计信息对象是最新的。
可以对操作进行提示来控制统计信息对象的行为。
create index .... with(statistics_norecompute = on)
create statistics .... with(norecompute)
虽然这一些选项一般来说是开启的,但是下面情况可禁用创建或更新统计信息的功能。
1、DBA 明确决定更新统计信息而不是自动更新,数据库有一个维护窗口,这种情况下是DBA 相信统计信息改变会使
优化器选择一种比较慢的计划
2、数据表太大、自动更新发的时间太长。
3、数据库表中有许多的唯一值,用于生成统计信息的采样频率不足以获取生成一个优良执行计划所需的所有统计信息。
DBA 可以利用一个维护窗口提高采样频率(默认频率会根据表大小而变化)手动更新统计信息。
4、数据库定义了一个很短的查询超时并且不希望自动统计信息造成查询时间明显长很多,因为这样可能会引起查询超时。