SQL Server 统计信息

统计信息是如何提高SQL Server查询性能的?统计直方图用作在查询执行计划中查询优化器的选择依据。如果一个查询谓词包含统计信息的列,那么查询优化器不需要预测该查询中影响行数,因此,查询优化器有足够的信息去创建执行计划。
SQL Server创建执行计划有一下几种不同的方式:

  • 统计信息会在每个新创建的索引中自动创建统计信息。
  • 如果数据库中AUTO_CREATE_STATISTICS被设置为ON,SQL Server将会自动对查询中用到的,且没有索引的列自动创建统计信息。

AUTO_CREATE_STATISTICS选项:
当把该选项设为ON时,查询优化器会对在谓词中使用的到列,如果这些列的统计信息不可用,则会单独对每列创建统计信息。可以通过以下语句启用自动统计信息创建功能:

ALTER  DATABASE [DBNAME] SET AUTO_CREATE_STATISTICS ON

Auto Update Statistics选项:
统计信息会在查询编译或者执行缓存执行计划前被检查。当在以下情况下,统计信息会被认为过期:

  • 在一个空表中有数据的改动。
  • 少于500行的表增加500行或者更多
  • 当表中行多于500行时,数据的变化量大于500+20%*表中数据行数。
  • 在Tempdb中的表,少于6行且最少有6行被更改。

开启自动更新统计信息:

ALTER  DATABASE [DBNAME] SET AUTO_UPDATE_STATISTICS ON

过时的统计信息会引起大量的性能问题,所以建议开启自动更新。它的默认设置是ON。有时候,过期的统计信息可能比没有统计信息更加糟糕。
使用以下语句来开启异步更新统计信息:

ALTER  DATABASE [DBNAME] SET AUTO_UPDATE_STATISTICS_ASYNC ON

如果开启了这个选项,查询优化器将先执行一次查询,然后更新过期的统计信息。当你把这个选项设为OFF时,查询优化器将在编译查询之前更新过期统计信息。这个选项在OLTP环境下很有用,但在数据仓库中有负面影响。

手工操作统计信息

  • 创建统计信息在Sales.SalesOrderHeader表的DueDate列上
CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate)  
  • 更新Sales.SalesOrderHeader表的全部统计信息
UPDATE STATISTICS Sales.SalesOrderHeader  
  • 更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息
UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader 
  • 更新数据库中所有可用的统计信息
EXEC sys.sp_updatestats  
  • 手动删除统计信息
DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader  
    原文作者:cebdba
    原文地址: https://www.jianshu.com/p/b135494c4c51
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞