除調(diào)優(yōu)方法外,我們給你展示了最佳實踐,你可應(yīng)用到你的SQL語句中以提高性能(所有的例子和語法都已在Microsoft SQL Server 2000中驗證)。
閱讀該系列文章后,你應(yīng)該對Microsoft 工具包中提供的查詢優(yōu)化工具和技巧有一個基本的了解,我們將提供包含各種各樣的以提高性能和加速數(shù)據(jù)讀取操作的查詢技巧。
Microsoft提供了三種調(diào)優(yōu)查詢的主要的方法:
使用SET STATISTICS IO 檢查查詢所產(chǎn)生的讀和寫;
使用SET STATISTICS TIME檢查查詢的運行時間;
使用SET SHOWPLAN 分析查詢的查詢計劃 。
SET STATISTICS IO
命令SET STATISTICS IO ON 強制SQL Server 報告執(zhí)行事務(wù)時I/O的實際活動。它不能與SET NOEXEC ON 選項配對使用,因為它僅僅對監(jiān)測實際執(zhí)行命令的I/O活動有意義。一旦這個選項被打開,每個查詢產(chǎn)生包括I/O統(tǒng)計信息的額外輸出。為了關(guān)閉這個選項,執(zhí)行SET STATISTICS IO OFF。
注:這些命令也能在 Sybase Adaptive Server中運行,雖然結(jié)果集可能看起來有點不同。
例如,下面是在Northwind 數(shù)據(jù)庫中對于employees表上的一個行統(tǒng)計的簡單查詢腳本而獲得的I/O統(tǒng)計信息:
SET STATISTICS IO ON
GO
SELECT COUNT(*) FROM employees
GO
SET STATISTICS IO OFF
GO
Results:
---------------
2977
Table ‘Employees’ . Scan count 1,
logical read 53, physical reads 0, readahead reads 0.
這個掃描統(tǒng)計告訴我們掃描執(zhí)行的數(shù)量,邏輯讀顯示的是從緩存中讀出來的頁面的數(shù)量,物理讀顯示的是從磁盤中讀的頁面的數(shù)量,Read-ahead 讀顯示了放置在緩存中用于將來讀操作的頁面數(shù)量。
此外,我們執(zhí)行一個系統(tǒng)存儲過程獲得表大小的統(tǒng)計信息以供我們分析:
sp_spaceused employees
Results:
name rows reserved data index_size unused
-------------- -------- --------- -------
Employees 2977 2008KB 1504KB 448KB 56KB
通過看這些信息我們能得到些什么呢?
這個查詢沒有掃描整個表,在表中的數(shù)據(jù)量超過1.5M字節(jié),而僅僅執(zhí)行了53個邏輯I/O操作就得到了結(jié)果。這表明該查詢發(fā)現(xiàn)了一個可用來計算結(jié)果的索引,并且掃描索引比掃描所有數(shù)據(jù)頁花費更少的I/O操作。
索引頁幾乎全部放在數(shù)據(jù)緩存中,所以物理讀的值是零。這是因為我們之前不久是在employees表上執(zhí)行了其他查詢,此時表和它的索引已經(jīng)被緩存。你的查詢開銷可能有不同。
Microsoft報告沒有read-ahead(預(yù)讀)活動。在這種情況下,數(shù)據(jù)和索引頁已經(jīng)被緩存起來了。當(dāng)對一個很大的表作表掃描時,read-ahead可能會半路插入進來,并且在你的查詢用到它們之前緩存起所需的頁。當(dāng)SQL Server確定你的事務(wù)是順序讀取數(shù)據(jù)庫頁并且認(rèn)為它能預(yù)測到你下一步將用到的頁面時,Real-ahead會自動打開。實際上一個獨立的SQL Server連接在你的進程之前已開始運行并為它緩存數(shù)據(jù)頁。(配置和優(yōu)化read-ahead 參數(shù)已超出這篇文章的討論范圍。
在這個例子中,該查詢已經(jīng)盡可能有效率地執(zhí)行了,不必進一步優(yōu)化。
SET STATISTICS TIME
一個事務(wù)的實耗時間是一個不穩(wěn)定的測量,因為這些時間與在服務(wù)器上其他用戶的活動有關(guān)。然而,相比那些對你的用戶沒有任何意義的數(shù)據(jù)頁數(shù)字,它提供了一些實際的測量。他們關(guān)心等待查詢返回的時間消耗,不關(guān)心數(shù)據(jù)的緩存和有效的read-ahead。SET STATISTICS TIME ON命令報告下面的查詢的實際占用時間和CPU使用情況。執(zhí)行SET STATISTICS TIME OFF禁止這個選項。
SET STATISTICS TIME ON
GO
SELECT COUNT(*) FROM titleauthers
GO
SET STATISTICS TIME OFF
GO
Results:
SQL Server Execution Times;
Cup time=0 ms. Elapsed time=8672 ms.
SQL Server Parse and Compile Time:
Cpu time=10 ms
----------------
25
(1 row(s) affected)
SQL Servre Execution Times:
Cpu time=0 ms.? Elapsed time=10 ms.
SQL Server Parse and Compile Time:
Cup time=0 ms
第一條信息報告了多少使人困惑的占用(實耗)時間,8672豪秒,這個數(shù)據(jù)與我們的腳本不相關(guān),這顯示的是之前一個命令執(zhí)行以來逝去的時間。你可以忽略這條信息。SQL Server僅僅花費10毫秒時間去分析和編譯該查詢。花費0毫秒去執(zhí)行它(在查詢結(jié)果可看到)。其真實的意思是這個查詢所花費的時間太短以至不能計量。最后的信息報告了這個SET STATISTICS TIME OFF命令相關(guān)的分析及編譯花費了0毫秒。你可以忽略這個信息。最重要的信息以加重字體突出顯示。