查询优化(2)
繼續查詢優化(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。
打開此選項后,更新統計信息將不會影響到此刻正在運行的語句。
轉載于:https://www.cnblogs.com/DBFocus/archive/2010/06/11/1756683.html
總結
- 上一篇: RFID自动识别术语解释(zt)
- 下一篇: ASCII,unicode, utf8