查询优化(2)
2010-06-11 22:21 知行思新 阅读(2070) 评论(1) 编辑 收藏 举报继续查询优化(1)中的讨论,这次我们来看一下统计数据的管理。
统计信息管理
SQL Server会为索引列和数据列维护统计信息。一般情况下这些统计信息能被自动维护地很好,但在某些情况下我们需要手动来维护这些信息。
索引统计信息
1 2 3 4 | --在Northwind库中创建索引,并查看该索引的统计信息 CREATE INDEX cust_date_indx ON Orders(CustomerID, OrderDate) DBCC SHOW_STATISTICS( 'Orders' , 'cust_date_indx' ) |
数据列(非索引列)统计信息
当一个查询运行后,SQL Server会自动为出现在查询语句where中的数据列创建统计信息。
1 2 3 4 5 | exec sp_helpstats Customers; --第一次运行上述语句,我们不会得到任何统计信息。 select * from Customers where ContactName = 'Hanna Moos' ; go exec sp_helpstats Customers; |
通过CREATE STATISTICS命令,我们可以手工创建统计信息。
计算列上的统计信息
对于where子句中的计算表达式,SQL Server无法根据数据列统计信息来估计其选择性。
1 | WHERE UnitPrice * Quantity > 1000 |
上述语句,SQL Server无法准确估计其选择性。我们可以创建计算列,这样SQL Server就能为其创建统计信息。
1 2 | ALTER TABLE [ Order Details] ADD TotalSale AS UnitPrice * Quantity; |
手动统计信息刷新
我们可以使用UPDATE STATISTICS命令来手动更新统计信息或改变默认的采样率。SQL Server默认分析一些行来生成统计信息。
我们可以增大采样率,或对表进行全扫描来手工生成统计信息。当调试一个低效的执行计划时,通过对表进行全扫描来更新统计信息是一个好主意。
1 2 | --对Orders表进行全扫描来更新其所有统计信息 UPDATE STATISTICS Orders WITH FULLSCAN; |
SQL Server 2005还提供了一个数据库选项:AUTO_UPDATE_STATISTICS_ASYNC。
打开此选项后,更新统计信息将不会影响到此刻正在运行的语句。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步