SQL Server统计信息
作者:网络转载 发布时间:[ 2013/4/10 9:57:43 ] 推荐标签:
还可以使用以下方式查看:
sp_helpstats 'Sales.SalesOrderHeader'
步骤:
1、现在开始来看看创建和更新统计信息的不同方式,在数据库级别,有一个选项,默认为ON,这个选项是:Auto_Create_Statistics:
ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON
2、启用同步创建列上统计信息的选项,Auto_Create_Statistics,当执行一个查询一个精确数据量的数据时,优化引擎会在这个列上创建一个柱状图表。由SQLServer创建的统计信息以_WA开头,可以看看这些列表:
SELECT st.name AS StatName ,
COL_NAME(stc.object_id, stc.column_id) AS ColumnName ,
OBJECT_NAME(st.object_id) AS TableName
FROM sys.stats AS st
INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id
AND st.stats_id = stc.stats_id
WHERE st.name LIKE '_WA%'
3、上面的统计信息不会因为Auto_Create_Statistics选项设为ON而结束。这些是强制你的统计信息更新以保证性能。这个只是定义你的统计信息是否同步更新。默认情况下这个选项是为ON的。但是有时候不一定符合你的要求,此时可以使用手动更新计划:
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON
4、Auto_Update_Statistics选项会在创建索引时、通过Auto_Create_Statistics或者用户使用CREATE STATISTICS命令手动创建统计信息时自动更新统计信息,下面命令使用异步方式更新统计信息:
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON
5、此时来看看执行上面语句后的数据库统计信息配置情况:
SELECT is_auto_update_stats_async_on ,
is_auto_create_stats_on ,
is_auto_update_stats_on
FROM sys.databases
WHERE name = 'AdventureWorks'
6、上面的方式均为自动创建和更新统计信息,现在来看看如何手动实现:
--创建统计信息在Sales.SalesOrderHeader表的DueDate列上
CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate)
GO
--更新Sales.SalesOrderHeader表的全部统计信息
UPDATE STATISTICS Sales.SalesOrderHeader
GO
--更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息
UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader
GO
--更新数据库中所有可用的统计信息
EXEC sys.sp_updatestats
GO
--手动删除统计信息
DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader
GO
分析:
当索引创建时,优化器会创建统计信息到索引列所在的表或者视图上,除此之外,如果对Auto_Create_Statistics选项设置了ON,优化器会创建一个单列统计信息,及时它没有出现在查询的所需列上。如果你觉得一些查询性能有问题,检查所有谓词,如果这些列缺失了统计信息,你可以手动增加,有时候,DTA(数据库优化顾问)也会建议你创建统计信息。
一般情况下,在查询编译之前,如果开启了同步更新统计信息,SQLServer如果发现统计信息过时,会引发更新统计信息的操作,然后你的查询会使用上实时的统计信息。而这个操作会阻塞查询,知道更新结束,但是不会保留这些查询,它会更新统计信息以便下次运行查询的时候可以使用上较新的统计信息。
扩充知识:
默认情况下,只有sysadmin/db_owner/对象的创建者这三种角色的成员才有权限创建和更新统计信息。
柱状图:
柱状图是一类由SQLServer为了统计信息而生成的表。可以认为是一个显示对应列上统计信息大和小值范围的报表。

sales@spasvo.com