2010-01-29 82 views
8

我最近聽到很多,我應該看看我的SQL的執行計劃,以判斷它的執行情況。不過,我並不確定該功能從哪裏開始,或者它的意思。什麼是SQL執行計劃?它們如何幫助我?

我正在尋找一個很好的解釋,說明執行計劃的作用,它的侷限性以及我如何利用它或指導一個資源。

回答

4

它描述了服務器用來檢索數據的實際算法。

SQL這樣的查詢:

SELECT * 
FROM mytable1 
JOIN mytable2 
ON  … 
GROUP BY 
     … 
ORDER BY 
     … 

,介紹什麼應該做的事,但不如何它應該做的事。

執行規劃顯示如何:其中使用索引,其中加入被選擇的方法(嵌套循環或哈希聯接或合併加入),將結果如何(使用排序或散列)分組,它們是如何排序等。

不幸的是,即使是現代SQL引擎不能自動找到或多或少的複雜查詢的最佳計劃,它仍然需要一個SQL開發商重新制定查詢,以便它們是高性能(即使他們原來的查詢做什麼)。

一個經典的例子是,這些也查詢:

SELECT (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.id <= mo.id 
     ) 
FROM mytable mo 
ORDER BY 
     id 

SELECT RANK() OVER (ORDER BY id) 
FROM mytable 

,它做同樣在理論上應該使用相同的算法來執行。然而,沒有實際的引擎會優化以前的查詢來實現相同的算法,即,即將計數器存儲在變量中並增加它。

它會按照要求做的事情:一遍又一遍地重複行數。

爲了優化查詢,您需要真正瞭解幕後發生的事情,這就是執行計劃向您展示的內容。

您可能需要閱讀這篇文章在我的博客:

1

在SQL Management Studio中,簡單地使用「Ctrl L」(Query | Display Estimated Execution Plan)查詢一些查詢。

這將導致顯示執行計劃的圖形視圖,其首先比其文本版本更容易「解碼」。

查詢計劃在一個小簡而言之
本質上查詢計劃顯示的方式SQL Server的打算解決的查詢使用。
確實有很多選擇,即使是簡單的查詢。
例如,在處理JOIN時,需要決定是循環遍歷[表A]的[過濾]行並查找「表B」的行,還是首先循環「表B」,而不是這是一個簡化的例子,因爲還有很多其他的技巧可以用來處理JOIN)。通常情況下,SQL將估計由任一表產生的[過濾]行數,並選擇外循環中最小計數的行數(因爲這會減少另一個表中的查找數)
另一個示例,是決定使用哪些索引(或不使用)。

有許多在線資源以及更詳細地描述查詢計劃的書籍,難點在於SQL性能優化是一個非常廣泛和複雜的問題,許多此類資源傾向於爲新手; 首先需要理解SQL Server(索引工作方式,數據存儲方式,聚集索引和堆之間的區別......)的基本原理和結構,然後再深入到許多[重要]細節的查詢優化。這有點像棒球:首先你需要了解規則,然後才能理解與遊戲策略相關的所有微妙[和重要]概念。

看到這個相關的SO Question爲額外的指針。

2

HereHere一些文章一探究竟。執行計劃可讓您識別耗費時間的區域,因此可以改善查詢。

0

這是一個非常嚴重的知識部分。我高度推薦有關這方面的特殊培訓課程。至於我花了一週後的課程我提高查詢性能的約1000倍(懷舊

1
  1. 執行計劃顯示了SQL服務器究竟是如何處理查詢
  2. 它是作爲查詢優化的一部分SQL Server的過程。這不是你直接創建的東西。
  3. 它會顯示它已決定哪些索引最適合使用,基本上是SQL服務器如何處理查詢的計劃
  4. 查詢優化程序將採取查詢,分析它並可能提出若干不同的執行計劃。這是一個基於成本的優化過程,它會選擇一個感覺最好的。
  5. 一旦生成執行計劃,它將進入計劃緩存,以便後續調用同一查詢可以再次重複使用同一計劃,以節省必須重做工作以制定計劃。
  6. 執行計劃根據它們的值自動從緩存中刪除(低價值計劃在高價值計劃執行前會被移除以提供最大性能增益)
  7. 執行計劃可幫助您發現性能問題,例如索引缺少
0

執行計劃顯示數據庫如何獲取,排序和篩選查詢所需的數據。

例如:

SELECT 
    * 
FROM 
    TableA 
INNER JOIN 
    TableB 
ON 
    TableA.Id = TableB.TableAId 
WHERE 
    TableB.TypeId = 2 
ORDER BY 
    TableB.Date ASC 

將導致示出數據庫中獲取從表A和表B的記錄,匹配​​它們以滿足JOIN,濾波以滿足WHERE和排序以滿足ORDER BY的執行計劃。因此,您可以計算出查詢速度減慢的情況,查看索引或者以其他方式加快速度是有益的。