继续查询优化(1)中的讨论,这次我们来看一下统计数据的管理。
统计信息管理
SQL Server会为索引列和数据列维护统计信息。一般情况下这些统计信息能被自动维护地很好,但在某些情况下我们需要手动来维护这些信息。
索引统计信息
--在Northwind库中创建索引,并查看该索引的统计信息 CREATE INDEX cust_date_indx ON Orders(CustomerID, OrderDate) DBCC SHOW_STATISTICS('Orders', 'cust_date_indx')
数据列(非索引列)统计信息
当一个查询运行后,SQL Server会自动为出现在查询语句where中的数据列创建统计信息。
exec sp_helpstats Customers; --第一次运行上述语句,我们不会得到任何统计信息。 select * from Customers where ContactName = 'Hanna Moos'; go exec sp_helpstats Customers;
通过CREATE STATISTICS命令,我们可以手工创建统计信息。
计算列上的统计信息
对于where子句中的计算表达式,SQL Server无法根据数据列统计信息来估计其选择性。
WHERE UnitPrice * Quantity > 1000
上述语句,SQL Server无法准确估计其选择性。我们可以创建计算列,这样SQL Server就能为其创建统计信息。
ALTER TABLE [Order Details] ADD TotalSale AS UnitPrice * Quantity;
手动统计信息刷新
我们可以使用UPDATE STATISTICS命令来手动更新统计信息或改变默认的采样率。SQL Server默认分析一些行来生成统计信息。
我们可以增大采样率,或对表进行全扫描来手工生成统计信息。当调试一个低效的执行计划时,通过对表进行全扫描来更新统计信息是一个好主意。
--对Orders表进行全扫描来更新其所有统计信息 UPDATE STATISTICS Orders WITH FULLSCAN;
SQL Server 2005还提供了一个数据库选项:AUTO_UPDATE_STATISTICS_ASYNC。
打开此选项后,更新统计信息将不会影响到此刻正在运行的语句。