查询优化(2)
繼續(xù)查詢優(yōu)化(1)中的討論,這次我們來(lái)看一下統(tǒng)計(jì)數(shù)據(jù)的管理。
統(tǒng)計(jì)信息管理
SQL Server會(huì)為索引列和數(shù)據(jù)列維護(hù)統(tǒng)計(jì)信息。一般情況下這些統(tǒng)計(jì)信息能被自動(dòng)維護(hù)地很好,但在某些情況下我們需要手動(dòng)來(lái)維護(hù)這些信息。
?
索引統(tǒng)計(jì)信息
--在Northwind庫(kù)中創(chuàng)建索引,并查看該索引的統(tǒng)計(jì)信息 CREATE INDEX cust_date_indx ON Orders(CustomerID, OrderDate)DBCC SHOW_STATISTICS('Orders', 'cust_date_indx')?
數(shù)據(jù)列(非索引列)統(tǒng)計(jì)信息
當(dāng)一個(gè)查詢運(yùn)行后,SQL Server會(huì)自動(dòng)為出現(xiàn)在查詢語(yǔ)句where中的數(shù)據(jù)列創(chuàng)建統(tǒng)計(jì)信息。
exec sp_helpstats Customers; --第一次運(yùn)行上述語(yǔ)句,我們不會(huì)得到任何統(tǒng)計(jì)信息。 select * from Customers where ContactName = 'Hanna Moos'; go exec sp_helpstats Customers;通過(guò)CREATE STATISTICS命令,我們可以手工創(chuàng)建統(tǒng)計(jì)信息。
?
計(jì)算列上的統(tǒng)計(jì)信息
對(duì)于where子句中的計(jì)算表達(dá)式,SQL Server無(wú)法根據(jù)數(shù)據(jù)列統(tǒng)計(jì)信息來(lái)估計(jì)其選擇性。
WHERE UnitPrice * Quantity > 1000上述語(yǔ)句,SQL Server無(wú)法準(zhǔn)確估計(jì)其選擇性。我們可以創(chuàng)建計(jì)算列,這樣SQL Server就能為其創(chuàng)建統(tǒng)計(jì)信息。
ALTER TABLE [Order Details] ADD TotalSale AS UnitPrice * Quantity;?
手動(dòng)統(tǒng)計(jì)信息刷新
我們可以使用UPDATE STATISTICS命令來(lái)手動(dòng)更新統(tǒng)計(jì)信息或改變默認(rèn)的采樣率。SQL Server默認(rèn)分析一些行來(lái)生成統(tǒng)計(jì)信息。
我們可以增大采樣率,或?qū)Ρ磉M(jìn)行全掃描來(lái)手工生成統(tǒng)計(jì)信息。當(dāng)調(diào)試一個(gè)低效的執(zhí)行計(jì)劃時(shí),通過(guò)對(duì)表進(jìn)行全掃描來(lái)更新統(tǒng)計(jì)信息是一個(gè)好主意。
--對(duì)Orders表進(jìn)行全掃描來(lái)更新其所有統(tǒng)計(jì)信息 UPDATE STATISTICS Orders WITH FULLSCAN;SQL Server 2005還提供了一個(gè)數(shù)據(jù)庫(kù)選項(xiàng):AUTO_UPDATE_STATISTICS_ASYNC。
打開(kāi)此選項(xiàng)后,更新統(tǒng)計(jì)信息將不會(huì)影響到此刻正在運(yùn)行的語(yǔ)句。
轉(zhuǎn)載于:https://www.cnblogs.com/DBFocus/archive/2010/06/11/1756683.html
總結(jié)
- 上一篇: RFID自动识别术语解释(zt)
- 下一篇: ASCII,unicode, utf8