HOW TO:SQL Server 應用程式效能疑難排解

文章翻譯 文章翻譯
文章編號: 224587 - 檢視此文章適用的產品。
本文曾發行於 CHT224587
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何疑難排解 SQL Server 效能問題。疑難排解效能問題需要使用一系列的步驟來隔離和判斷應用程式效能低落的原因。可能的原因包括:
  • 封鎖。
  • 系統資源競爭。
  • 應用程式設計問題。
  • 一組需要較長執行時間的查詢或預存程序。
本文將告訴您,如何判斷效能問題的來源。它也參考「Microsoft 知識庫」中涵蓋特定效能問題之其他疑難排解詳細資料的其他文件。

SQL Profiler


SQL Profiler 是疑難排解 SQL Server 7.0 或更新版本之應用程式效能的強大工具。SQL Profiler 可讓您輕易地擷取在一般負載之下伺服器上發生的所有事件,並提供關於它們的資訊。使用 SQL Profiler 加上 Microsoft Windows NT 的「效能監視器」以及一些簡單的查詢來識別是否正發生封鎖的現象,將可提供您在解決重大效能問題時所需的資訊。

監視的內容

1. 設定 SQL Profiler 以擷取追蹤。如果要執行這項操作,請依照下列步驟執行:
  1. 開啟 SQL Profiler。
  2. [工具] 功能表上,按一下 [選項]
  3. 請確定選取 [所有事件類別][所有資料欄位] 選項。
  4. 按一下 [確定]
  5. 建立新的追蹤。
  6. [檔案] 功能表上,指向 [新增],然後按一下 [追蹤]
  7. [一般] 索引標籤上,指定要擷取資料的追蹤名稱與檔案。
  8. [事件] 索引標籤上,將下列事件類型新增至追蹤:

    摺疊此表格展開此表格
    標題要新增的事件說明
    資料指標CursorPrepare此事件指出已使用 ODBC、OLEDB 或 DB-Library 準備 SQL 陳述式上的資料指標。
    錯誤和警告Missing Column Statistics此事件指出有助於查詢最佳化工具的欄位統計資料不存在。Text 欄位會顯示遺失統計資料的欄位清單。此事件加上 Misc:Auto-UpdateStats 事件,指出已觸發 [自動建立統計資料] 選項。
    雜項注意事項此事件指出用戶端傳送的注意事項訊號。
    雜項Auto-UpdateStats此事件指出已觸發 [自動更新統計資料] 選項。
    雜項Exec Prepared SQL此事件指出 ODBC、OLE DB 或 DB-Library 已執行先前準備的 Transact-SQL 陳述式。
    雜項Execution Plan此事件顯示已執行的 Transact-SQL 陳述式之計劃樹狀目錄。
    雜項Prepare SQL此事件指出 ODBC、OLE DB 或 DB-Library 應用程式準備了要使用的 Transact-SQL 陳述式。
    雜項Unprepare SQL此事件指出 ODBC、OLE DB 或 DB-Library 應用程式取消準備要使用的 Transact-SQL 陳述式。
    工作階段Connect此事件指出已建立新的連線。
    工作階段Disconnect此事件指出用戶端已中斷連線。
    工作階段Existing Connection此事件指出啟動 SQL Profiler 追蹤時已有連線存在。
    預存程序SP:Completed此事件指出預存程序已完成執行。
    預存程序SP:Recompile此事件指出預存程序已在執行期間重新編譯。
    預存程序SP:Starting此事件指出預存程序已開始執行。
    預存程序SP:StmtCompleted此事件指出預存程序中的陳述式已完成執行。
    TSQL:SQL:BatchCompleted此事件指出已完成 Transact-SQL 批次。Text 欄位顯示已執行該陳述式。
    TSQL:SQL:StmtCompleted此事件指出已完成 Transact-SQL 陳述式。Text 欄位顯示已執行該陳述式。
    TSQL:RPC:Completed此事件指出已完成遠端程序呼叫 (RPC)。
  9. 如果應用程式收到逾時錯誤、停止回應 (擱置) 或遇到其他導致有問題的陳述式一直無法完成的事件,則也請加入下列事件:

    摺疊此表格展開此表格
    TSQL:SQL:BatchStarting此事件指出 Transact-SQL 批次的開始。Text 欄位顯示正在執行的陳述式。
    TSQL:SQL:StmtStarting此事件指出 Transact-SQL 陳述式的開始。Text 欄位顯示正在執行的陳述式。
    TSQL:RPC:Starting此事件指出遠端程序呼叫 (RPC) 的開始。
    預存程序SP:StmtStarting此事件指出預存程序中的陳述式開始執行。


    這將可協助確定當發生逾時可以查看曾經執行的陳述式。
  10. [資料欄位] 索引標籤上,請確定包括下列欄位:

    適用於 SQL Server 2000

    開始時間

    結束時間

    LoginSid

    SPID

    事件類別

    TextData

    IntegerData

    BinaryData

    持續時間

    CPU

    讀取

    寫入

    應用程式名稱

    NT 使用者名稱

    DBUserName


    適用於 SQL Server 7.0

    開始時間

    結束時間

    連接識別碼

    SPID

    事件類別

    文字

    整數資料

    二進位資料

    持續時間

    CPU

    讀取

    寫入

    應用程式名稱

    NT 使用者名稱

    SQL 使用者名稱

如需有關 SQL Profiler 的使用資訊,請參閱 SQL Server 7.0 和 SQL Server 2000 的《線上叢書》。


2. 使用「效能監視器」擷取 Windows NT 與 SQL Server 計數器。如果要執行這項操作,請依照下列步驟執行:
  1. 啟動 Windows NT 的「效能監視器」。
  2. [檢視] 功能表上,按一下 [記錄檔]
  3. [選項] 功能表上,按一下 [記錄檔]
  4. 指定檔案名稱與位置以記錄效能計數器。您可以適當地調整更新間隔。
  5. [編輯] 功能表上,按一下 [加入到記錄檔]
  6. 新增所有的物件。包括 Windows NT 與 SQL Server 物件。
  7. 如果要啟動記錄檔,在 [選項] 功能表上,按一下 [記錄檔],然後按一下 [啟動記錄檔] 按鈕。

如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
150934 如何建立效能監視器記錄以進行 NT 疑難排解

3. 檢查封鎖。

如果要查看是否發生封鎖,請執行 sp_who 系統預存程序:
exec sp_who
此輸出將包含 blk 欄位。檢查輸出,查看有無任何指出發生封鎖的非零項目。發生效能低落時,請定期在整個時程中執行此程序。

注意 執行 sp_who 系統預存程序只能檢查是否有封鎖存在。一般而言,它無法提供足夠的資訊以排解封鎖問題。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
251004 INF:如何監視 SQL Server 7.0 封鎖

在一般負載下執行應用程式

最好在相同的時程內能擷取 SQL Profiler、「效能監視器」以及封鎖輸出。此時程必須包含應用程式效能從良好變成很差的時間。結合此項資訊,將可協助您更清楚地瞭解哪堛漁蠕鉣傴C。


解譯結果

  1. 檢查封鎖。

    如果 sp_who 輸出中的 blk 欄位不是零,這表示在系統上發生封鎖。如果處理序互相封鎖,則遭到封鎖的處理序可能需要較長的執行時間。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    224453 INF:了解並解決 SQL Server 7.0 之鎖定問題
  2. 檢查 SQL Profiler 輸出。

    有效地檢視 SQL Profiler 資料在解決效能問題時極為有用。最重要的是要瞭解您不需查看所擷取的全部內容。請精挑細選。SQL Profiler 提供的功能,可協助您有效檢視已擷取的資料。在 [內容] 索引標籤上 (按一下 [檔案] 功能表上的 [內容]),SQL Profiler 可讓您移除資料欄位或事件、依資料欄位分組 (排序) 以及套用篩選器,從而限制要顯示的資料。您可以搜尋整個追蹤或僅搜尋特定欄位以尋找特定值 (按一下 [檔案] 功能表上的 [尋找])。您也可以將 SQL Profiler 資料儲存至 SQL Server 資料表 (在 [檔案] 功能表上,指向 [另存新檔],再按一下 [追蹤資料表]),然後再針對該資料表執行 SQL 查詢。

    請務必只在先前儲存的追蹤檔案上執行篩選。如果您在使用中的追蹤上執行這些步驟,可能會失去自追蹤啟動後所擷取到的資料。請先將使用中追蹤儲存到檔案或資料表 (按一下 [檔案] 功能表上的 [另存新檔]),然後在您繼續之前重新開啟它 (按一下 [檔案] 功能表上的 [開啟])。當您使用已儲存的追蹤檔案時,篩選的動作並不會永遠移除篩選掉的資料,它只是不加以顯示。您可以視需要新增和移除事件和資料欄位,協助您將焦點集中在搜尋上。

    檢查 SQL Profiler 追蹤檔案以分析效能問題的第一步,是判斷在伺服器上有哪些地方發生不同類型的事件。

    依事件類別,將追蹤分組

    a. 在 [檔案] 功能表上,按一下 [內容]

    b. 在 [資料欄位] 索引標籤上,使用 [向上] 按鈕移動 [群組] 標題下的[事件類別],然後使用 [向下] 按鈕移除 [群組] 標題下的其他資料欄位。

    c. 按一下 [確定]

    依事件類別欄位分組,可以顯示 SQL Server 上發生哪些類型的事件及其頻率。搜尋此欄位以尋找下列事件:

    SP:RECOMPILE

    此事件指出預存程序已在執行期間重新編譯。如果有數個重新編譯事件,則表示 SQL Server 將資源花費在編譯查詢而非執行查詢。

    如需有關預存程序重新編譯之疑難排解的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    243586Troubleshooting stored procedure recompilation


    注意事項

    注意事項訊息指出用戶端已取消某個查詢。這通常是因為下列兩個原因的其中之一所造成:

    使用者明確地取消查詢或結束應用程式。

    - 或 -

    已超過查詢的逾時時間。

    如果您看到注意事項訊號,這可能表示某些查詢的執行速度很慢。

    如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    243589在 SQL Server 7.0 或更新版本上的執行緩慢查詢疑難排解
    為了協助識別收到注意事項訊號的查詢,請修訂追蹤使其不依任何資料欄位來分組,並在收到它的系統處理序識別碼 (SPID) 上篩選 (在 [篩選] 索引標籤上,設定 SPID = x)。緊鄰在注意事項訊號前面的 SQL:StmtStartingSQL:BatchStartingSP:StmtStarting 事件是收到逾時或取消的查詢。只要在 [事件類別] 欄位尋找「注意事項」事件 (按一下 [編輯] 功能表上的 [尋找]),就可以很容易地找到這類查詢。

    PREPARE SQL 與 EXEC PREPARED SQL

    Prepare SQL 事件指出 ODBC、OLE DB 或 DB-Library 應用程式準備了要使用的 Transact-SQL 陳述式。Exec Prepared SQL 事件指出應用程式利用現有準備好的陳述式來執行命令。

    比較這兩個事件發生的次數。最理想的是,應用程式只要準備一次 SQL 陳述式,就可執行它數次。這將可使 Optimizer 在每次執行陳述式時省下編譯新計劃的成本。因此,Exec Prepared SQL 事件應該比 Prepare SQL 事件的數目大多了。如果 Prepare SQL 事件的數目大約等於 Exec Prepared SQL 事件的數目,這可能意謂著應用程式未好好利用準備/執行模型。最好不要準備只執行一次的陳述式。如需有關準備 SQL 陳述式的詳細資訊,請參閱《SQL Server 7.0 線上叢書》中的<準備 SQL 陳述式>主題。

    如果 Exec Prepared SQL 事件沒有超過 Prepare SQL 事件數目的三到五倍,則應用程式可能未有效地使用準備/執行模型。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    243588 資訊:特殊查詢效能的疑難排解

    在 SQL Server 2000 中,將可省去每個準備/執行中過多的往返,所以 3-5 的比率並不嚴格。然而,它仍然是良好的規則,可嘗試和重複使用準備好的計劃一次以上。

    Missing Column Statistics

    此事件指出 Optimizer 可用以產生較佳查詢計劃之統計資訊無法使用。這指出,查詢並非在所有相關的資料表都具有有用的索引。除了沒有有用的索引以外,SQL Server 甚至沒有相關欄位的統計資料可以為查詢計劃做出明智的決定。結果是,產生的查詢計劃可能不是最佳的計劃。如果您看到這些事件,請查看查詢和產生的執行計劃,然後參閱「Microsoft 知識庫」中的文件,以瞭解改善此查詢的效能所需採取的步驟:
    243589在 SQL Server 7.0 或更新版本上的執行緩慢查詢疑難排解

    當您檢視 Missing Column Statistics 事件時,請先將焦點放在與執行時間較長之查詢相關的事件上。有些事件可能由 SQL Server 使用 autostats 自動產生和解決,而不需要使用者介入。因此,最佳的策略是先將焦點集中在持續時間較長的查詢上 (如本文稍後所示),並注意是否有相關的 Missing Column Statistics 事件。

    如果您沒有看到這些事件類別的執行個體,那麼下一步就是判斷時間花到哪堨h了。

    依持續時間,將追蹤輸出分組

    a. 在 [檔案] 功能表上,按一下 [內容]

    [資料欄位] 索引標籤上,使用 [向上] 按鈕移動 [群組] 標題下的[持續時間],然後使用 [向下] 按鈕移除 [群組] 標題下的所有其他資料欄位。

    c. 在 [事件] 索引標籤上,請移除 TSQLStored Procedures 以外的所有群組。

    d. 按一下 [確定]

    依照持續時間分組後,您可以輕易地發現哪些 SQL 陳述式、批次或程序執行最慢。非常重要的是,不只要查看發生問題的時間,還要得到效能良好時的基準,才能進行比較。您可以篩選開始時間以便將追蹤分為兩個部分,分別是效能良好的部分以及效能不佳的部分。在效能良好的部分中,尋找持續時間最長的查詢。這些最有可能是問題的根源。如果整個系統效能都降低了,即使是良好的查詢都可能顯示出較長的持續時間,因為它們都在等待系統資源。

    如果您看到有少數的查詢具有很長的持續時間,請參閱「Microsoft 知識庫」中的文件:
    243589在 SQL Server 7.0 或更新版本上的執行緩慢查詢疑難排解
    如果您看到個別查詢的持續時間很短,且有好幾個查詢都是如此,並且「效能監視器」輸出 (於稍後說明) 中的 SQL Compilations/sec 計數器很高,請參閱「Microsoft 知識庫」中的文件:
    243588特殊查詢效能的疑難排解
    檢查其餘的資料欄位

    檢視追蹤資料中其他的資料欄位,還可對效能問題的本質產生其他的見解。下面是要考慮的一些項目:

    如果 CPU 使用率很高,請依 CPU 分組來查看哪些查詢是 CPU 時間的最大使用者。在 Text 欄位中搜尋「雜湊」或「合併」,來找出使用這些聯結類型查詢執行計劃。它們比巢狀迴圈聯結 (通常需要大量的 IO) 還需要更多 CPU 與記憶體。

    如果磁碟 IO 是瓶頸,請依讀取和寫入分組。請檢視 [應用程式名稱][NT 使用者名稱] 以及 [SQL 使用者名稱] 欄位來協助隔離出執行時間較長之查詢的來源。

    例外事件的整數資料欄位將指出傳回用戶端的任何錯誤。您可以搜尋《SQL Server 7.0 線上叢書》中的編碼,以尋找錯誤訊息的文字。

    [連接識別碼] 欄位有助於確定您是在查看特定用戶端的相同工作階段。SPID 就無法做到這點,因為使用者可能已中斷連線,然後有新的使用者連線並收到相同的 SPID。

    從這些欄位衍生的優點可能會視狀況而異;但是如果本文之前所提及、較明顯的欄位無法提供解答時,就應該檢查這些欄位。
  3. 檢查「效能監視器」輸出。

    「效能監視器」將顯示整個系統的瓶頸。有可能 SQL Server 與應用程式是如預期執行,但是電腦卻電力不足,缺少記憶體或其他資源。或者某些計數器可以指出應用程式和 SQL Server 之執行方式的問題。至少請檢查下列計數器:

  • 物件:Process

    計數器:Processor

    執行個體:SQL Server

  • 物件:Processor

    計數器:%Processor Time

    執行個體:檢查每個處理器的執行個體

  • 物件:Physical Disk

    計數器:Avg.Disk Queue Length

    執行個體:檢查每個實體磁碟的執行個體

  • 物件:SQL Server:SQL Statistics

    計數器:SQL Compilations/sec
查看某段時間內效能從良好變成很差的趨勢:什麼會先增加?是否會繫結電腦 CPU 或磁碟 IO?此資訊加上本文稍早的 Profiler 輸出,將可協助您縮小有問題的區域。高 CPU 使用率的問題可能表示大量的預存程序重新編譯、特殊的查詢編譯或是大量使用雜湊和合併聯結。您必須依照本文先前所參考的文章,決定出正確的做法。高磁碟佇列長度可能表示需要更多的系統記憶體或改良的磁碟子系統。

屬性

文章編號: 224587 - 上次校閱: 2007年10月26日 - 版次: 4.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 7.0 Standard Edition
關鍵字:?
kbhowto kbhowtomaster kbinfo kbproductlink KB224587
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com