代码改变世界

查询优化(2)

2010-06-11 22:21  知行思新  阅读(2068)  评论(1编辑  收藏  举报

继续查询优化(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。

打开此选项后,更新统计信息将不会影响到此刻正在运行的语句。