資訊:在 SQL Server 7.0 或更新版本上的執行緩慢查詢疑難排解

本文曾發行於 CHT243589
結論
該文章處理特定類型的效能問題,也就是應用程式在 Microsoft SQL Server 上可能經歷的效能問題:特定查詢或是群組查詢的緩慢效能。如果你將效能問題的疑難排除,但是尚未將問題和特定查詢或是能執行較預期為慢的小群組查詢分開,那麼在繼續進行前請參考下列在「Microsoft 知識庫」中的文章:

224587資訊:SQL Server 應用程式效能疑難排解
在該文章的其他部分則假定你已經使用上述文章以減少問題的範圍,並且已經獲得用特定事件以及在文章中的資料欄位追蹤的 SQL Server Profiler。
其他相關資訊
調整資料庫查詢可以是多方面的努力。下列章節要討論一般事項以檢視何時調查詢問效能。

確定有適當的索引

當你正經歷緩慢的查詢執行時間時,索引分析是最簡單的效能檢查方法之一。如果你正在調查單一查詢,你可以使用在 Query Analyzer 中的 [執行索引分析] 選項。如果你有大量工作量的 Profiler 追蹤,那麼你就可以使用 [索引微調精靈]。這兩種方法都使用 SQL Server 查詢最佳化以決定哪一種索引對特定的查詢有幫助。要確定在你的資料庫中是否有適當的索引,這是非常有效的方法。

若需要如何使用 [索引微調精靈] 的資訊,請參閱《SQL Server 7.0 線上叢書》的〈索引微調精靈〉。

如果你已經將應用程式從 SQL Server 之前的版本升級,那麼你會發現由於最佳化以及儲存引擎的改變,在 SQL Server 7.0 中不同的索引更有效率了。[索引微調精靈] 會幫助你決定是否索引策略的改變會改善效能。

移除「所有的查訊」、「表格」、以及「連結提示」

提示複寫查詢最佳化可以避免查詢最佳化選擇最快的執行計劃。由於最佳化的改變,較早版本的 SQL Server 改善的效能的提示可能對 SQL Server 7.0 沒有影響,或者可能危害到其效能。另外,聯結提示可能因為下列因素造成效能的低落:
  • 聯結提示避免特別的查詢被自動參數化並進行查詢計劃的後序快取。
  • 當你使用聯結提示時,也就意味著你必須要強迫查詢中所有的表格做聯結命令,即使這些聯結並沒有明確地使用提示。
如果你正在分析的查詢包含有任何提示,請將它們移除,並且重新評估效能。

檢視執行計劃

如果你已經確定有正確的索引,而且沒有提示會限制最佳化產生有效計劃的能力,那麼就是檢視查詢執行計劃的時候了。你可以用許多方法來查看查詢執行計劃:
  • SQL Server Profiler
    如果你擷取在 SQL Server Profiler 中的 MISC:Execution Plan 事件,那麼它正好會在特別系統程序 ID (SPID) 查詢的 StmtCompleted 事件之前發生。
  • 查詢分析器:圖形顯示計劃
    以在查詢視窗中選取的查詢,按一下 [查詢] 功能表選項,再一下 [顯示預計的執行計劃]

    請注意: 如果預存程序或批次產生並引用暫存表格,你就必須使用 SET STATISTICS PROFILE ON 陳述式或是在顯示執行計劃前明確地建立暫存表格。
  • SHOWPLAN_ALL 和 SHOWPLAN_TEXT 若要收到文字版本的預估執行計劃,可以使用 SET SHOWPLAN_ALL 和 SET SHOWPLAN_TEXT 選項。若需要詳盡的資訊,請參閱在《SQL Server 7.0 線上叢書》中的〈SET SHOWPLAN_ALL (T-SQL)〉和〈SET SHOWPLAN_TEXT (T-SQL)〉主題。

    請注意: 如果預存程序或批次產生並引用暫存表格,你就必須使用 SET STATISTICS PROFILE ON 或是在顯示執行計劃前明確地建立暫存表格。
  • 統計資料設定檔
    顯示圖形的或是用 SHOWPLAN 的預估執行計劃時,查詢並未實際地執行。因此,如果你在批次或儲存程序中建立暫存表格,你將不能顯示預估的執行計劃,因為暫存表格將不存在。STATISTICS PROFILE 最先執行查詢,然後顯示實際的執行計劃。若需要詳盡的資訊,請參閱在《SQL Server 7.0 線上手冊》的〈SET STATISTICS PROFILE (T-SQL)〉主題。執行 Query Analyzer 時,會在結果窗格中的 [執行計劃] 標籤上以圖形格式顯示。

測試「顯示計劃」輸出

「顯示計劃」輸出提供 SQL Server 所使用的某特定查詢的執行計劃的豐富的資訊。資訊以及產生事件的詳細內容在《SQL Server 7.0 線上手冊》的〈資料庫效能最佳化〉的章節中有詳細討論。下面是執行計劃的基本外觀,可以檢視以確定是否使用最好的計劃:
  • 適當的索引使用
    「顯示計劃」輸出會顯示在查詢中每一個相關的表格以及用來從中取得資料的存取路徑。若是用圖形 showplan,將滑鼠指標移到表格上方以查看每一個相關表格的詳細內容。如果索引正在使用中,你會看到 [索引搜尋]。如果沒有,你會看到堆集的 [表格掃描] 或是有叢集索引表格的 [叢集索引掃描]。注意 [叢集索引掃描] 會透過叢集索引指定被掃描的表格,不是正被使用以直接存取個別列的叢集索引。

    如果你認為有有用的索引,而且並沒有被用來查詢,那麼你可以試著強制有索引提示的索引。若需要關於索引提示的詳盡資訊,請參閱在《SQL Server 線上手冊》中的〈FROM (T-SQL)〉主題。
  • 適當的聯結順序
    「顯示計劃」 輸出會指定在查詢中哪一種順序的有關表格會被聯結。對巢狀迴路聯結,列出來上方的表格是外面的表格,而且應該是兩個表格中較小的一個。對雜湊聯結,上方的表格變成建立的輸入,而且應該也是兩個表格中較小的一個。然而,請注意順序是比較不重要的,因為如果它發現最佳化做了錯誤的決定,查詢處理器可以反向建立,並且在執行時間調查輸入。你可以藉由檢查在「顯示計劃」輸出的 [列計數] 預估來決定哪一個表格傳回較少列。

    如果你判定查詢可以從選擇性的聯結順序中獲益,那麼你可以試著強制有聯結提示的聯結順序。若需要更多關於聯結提示的詳盡資訊,請參閱在《SQL Server 7.0 線上手冊》中的〈FROM (T-SQL)〉主題。

    請注意: 使用在大型查詢中的聯結提示以暗中強制在查詢中其他表格的聯結順序,就好像已設定 FORCEPLAN 。
  • 適當的聯結型態
    SQL Server 使用巢狀迴路、雜湊、以及合併聯結。如果執行緩慢的查詢正使用聯結技術,你可以試著強制不同的聯結型態。舉例來說,如果查詢正在使用雜湊聯結,你就可以藉由使用 LOOP 聯結提示來強制巢狀迴路聯結。若需要更多關於聯結提示的詳盡資訊,請參閱《SQL Server 7.0 線上手冊》中的〈FROM (T-SQL)〉主題。

    請注意: 使用在大型查詢中的聯結提示以暗中強制在查詢中其他表格的聯結順序,就好像已設定 FORCEPLAN。
  • 平行執行
    如果你正使用多重處理器電腦,你也可以調查是否正在使用平行計劃。如果使用平行處理原則,你將會看到「平行處理原則 (PARALLELISM)」(蒐集資料流) 事件。如果特定查詢減緩使用並列計劃,那麼你就可以藉由使用 OPTION (MAXDOP 1) 提示來試著強制非並列計劃。若需要更多詳盡資訊,請參閱在《 SQL Server 7.0 線上手冊》中的〈SELECT (T-SQL)〉主題。
注意: 因為查詢最佳化通常會選擇對查詢最好的執行計劃,所以建議聯結提示、查詢提示、以及表格提示只用做有經驗的資料庫管理員最後的依據。

參考

下列在 SQL Server 7.0 線上叢書的主題提供關於最佳化查詢的資訊:
  • 「使用有效資料擷取來最佳化應用程式效能」
  • 「查詢微調」
  • 「查詢微調建議」
  • 「Transact - SQL 秘訣」
若需要更多關於在 SQL Server 7.0 上查詢效能疑難排解的資訊,請參閱 SQL Server 7.0:查詢效能疑難排解者,網址位於http://support.microsoft.com/?scid=ph;en-us;2862.
参考
本文件是根據Microsoft Knowledgebase 文件編號 Q243589翻譯的. 若要參考原始英文文件內容, 請至以下網址:

http://support.microsoft.com/support/kb/articles/Q243/5/89.asp
內容

文章識別碼:243589 - 最後檢閱時間:05/15/2011 12:15:00 - 修訂: 4.0

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 64-bit Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqldeveloper ssrvadmin kbhowto KB243589
意見反應