SQL Server查询优化器对于执行计划成本的评估是基于数据库统计信息的。所以,数据库统计信息直接影响到数据库查询效率,是数据库系统快速响应,低延迟特性的幕后英雄,但是我们又经常忽视数据库统计信息的存在和维护,怀着为英雄正名和唤醒大家对幕后英雄尊重的目的写作这篇文章。
什么是统计信息
SQL Server查询优化器使用统计信息来评估表或索引视图的一个或多个列中值的分布,这个分布信息提供了用于创建高质量的执行计划的基础(称为基数)。更为通俗一点说,SQL Server的执行计划是基于统计信息来评估的,优化器最终会选择最优的执行计划来为数据库系统提供数据存取功能。这位躲在幕后的英雄便是统计信息。
统计信息的作用
在关系型数据库系统(RDBMS)中,统计信息非常重要,当然MSSQL Server也不例外,它的准确与否直接影响到执行计划的优劣,数据库系统查询效率是否高效。具体表现在以下几个方面:
?查询优化器需要借助统计信息来判断是否使用索引。
?查询优化器需要根据统计信息来判断是使用嵌套循环连接,合并连接还是哈希连接。
?查询优化器根据表统计信息来找出最佳的执行顺序。
统计信息包含的内容
前面章节我们讲的都是比较枯燥的理论知识,这一小节我们来具体揭露幕后英雄的庐山真面目,它包含了哪些内容。
查询SQL Server统计信息非常简单,只需要使用DBCC命令传入表名字和统计信息名称即可,DBCC SHOW_STATISTICS('Table_Name','Statistics_name')。我们以AdventureWorks2008R2数据库下表Sales.SalesOrderDetail中统计信息AK_SalesOrderDetail_rowguid为例:
USE AdventureWorks2008R2 GO --DBCC SHOW_STATISTICS('Table_Name','Statistics_name') DBCC SHOW_STATISTICS('Sales.SalesOrderDetail','AK_SalesOrderDetail_rowguid')
查看统计信息的设置
关于统计信息设置,有四个重要的选项。
?Auto Create Statistics:SQL Server是否自动创建统计信息,默认开启。
?Auto Update Statistics:SQL Server是否自动更新统计信息,默认开启。
?Auto Update Statistics Asynchronously:SQL Server是否采用异步方式更新统计信息,默认关闭。
?Auto Create Incremental Statistics:SQL Server是否自动创建增量统计信息,这个选项是SQL Server 2014以来新增选项,默认关闭。
检验模版数据库Model统计信息设置,新增数据库会以这个数据库为模版。
SELECT database_name = name ,[IsAutoCreateStatistics?] = CASE is_auto_create_stats_on WHEN 1 THEN 'Yes' ELSE 'No' END ,[IsAutoUpdateStatistics?] = CASE is_auto_update_stats_on WHEN 1 THEN 'Yes' ELSE 'No' END ,[IsAutoUpdateStatsaAyncOn?] = CASE is_auto_update_stats_async_on WHEN 1 THEN 'Yes' ELSE 'No' END ,[IsAutoCreateStatisticsIncremental?] = CASE is_auto_create_stats_incremental_on WHEN 1 THEN 'Yes' ELSE 'No' END FROM sys.databases WHERE name = 'model'
结果展示如下:
我们以AdventureWorks2008R2为例来观察SQL Server数据库关于统计信息的设置。除了上面使用的检查方法以外,我们还可以使用下面的方法。
SELECT [IsAutoCreateStatistics?] = CASE WHEN DATABASEPROPERTYEX('AdventureWorks2008R2', 'IsAutoCreateStatistics') = 1 THEN 'Yes' ELSE 'No' END, [IsAutoUpdateStatistics?] = CASE WHEN DATABASEPROPERTYEX('AdventureWorks2008R2', 'IsAutoUpdateStatistics') = 1 THEN 'Yes' ELSE 'No' END, [IsAutoUpdateStatsaAyncOn?] = CASE WHEN DATABASEPROPERTYEX('AdventureWorks2008R2', 'Is_Auto_Update_stats_async_on') = 1 THEN 'Yes' ELSE 'No' END ,[IsAutoCreateStatisticsIncremental?] = CASE WHEN DATABASEPROPERTYEX('AdventureWorks2008R2', 'IsAutoCreateStatisticsIncremental') = 1 THEN 'Yes' ELSE 'No' END GO
当然我们也可以使用SSMS GUI方式查看:Right Click On Database => Properties => Options
统计信息对查询的影响
为了看清楚SQL Server统计信息是如何影响查询的,我们在AdventureWorks2008R2库下创建一个测试表dbo.tb_TestStats,并向测试表中插入10000条数据。
阅读全文请点击:http://click.aliyun.com/m/8859/