我最近聽到很多,我應該看看我的SQL的執行計劃,以判斷它的執行情況。不過,我並不確定該功能從哪裏開始,或者它的意思。什麼是SQL執行計劃?它們如何幫助我?
我正在尋找一個很好的解釋,說明執行計劃的作用,它的侷限性以及我如何利用它或指導一個資源。
我最近聽到很多,我應該看看我的SQL的執行計劃,以判斷它的執行情況。不過,我並不確定該功能從哪裏開始,或者它的意思。什麼是SQL執行計劃?它們如何幫助我?
我正在尋找一個很好的解釋,說明執行計劃的作用,它的侷限性以及我如何利用它或指導一個資源。
它描述了服務器用來檢索數據的實際算法。
的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
,它做同樣在理論上應該使用相同的算法來執行。然而,沒有實際的引擎會優化以前的查詢來實現相同的算法,即,即將計數器存儲在變量中並增加它。
它會按照要求做的事情:一遍又一遍地重複行數。
爲了優化查詢,您需要真正瞭解幕後發生的事情,這就是執行計劃向您展示的內容。
您可能需要閱讀這篇文章在我的博客:
在SQL Management Studio中,簡單地使用「Ctrl L」(Query | Display Estimated Execution Plan)查詢一些查詢。
這將導致顯示執行計劃的圖形視圖,其首先比其文本版本更容易「解碼」。
查詢計劃在一個小簡而言之:
本質上查詢計劃顯示的方式SQL Server的打算解決的查詢使用。
確實有很多選擇,即使是簡單的查詢。
例如,在處理JOIN時,需要決定是循環遍歷[表A]的[過濾]行並查找「表B」的行,還是首先循環「表B」,而不是這是一個簡化的例子,因爲還有很多其他的技巧可以用來處理JOIN)。通常情況下,SQL將估計由任一表產生的[過濾]行數,並選擇外循環中最小計數的行數(因爲這會減少另一個表中的查找數)
另一個示例,是決定使用哪些索引(或不使用)。
有許多在線資源以及更詳細地描述查詢計劃的書籍,難點在於SQL性能優化是一個非常廣泛和複雜的問題,許多此類資源傾向於爲新手; 首先需要理解SQL Server(索引工作方式,數據存儲方式,聚集索引和堆之間的區別......)的基本原理和結構,然後再深入到許多[重要]細節的查詢優化。這有點像棒球:首先你需要了解規則,然後才能理解與遊戲策略相關的所有微妙[和重要]概念。
看到這個相關的SO Question爲額外的指針。
這是一個非常嚴重的知識部分。我高度推薦有關這方面的特殊培訓課程。至於我花了一週後的課程我提高查詢性能的約1000倍(懷舊)
執行計劃顯示數據庫如何獲取,排序和篩選查詢所需的數據。
例如:
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的執行計劃。因此,您可以計算出查詢速度減慢的情況,查看索引或者以其他方式加快速度是有益的。
這裏有一個很好的資源,幫助您瞭解他們 http://downloads.red-gate.com/ebooks/HighPerformanceSQL_ebook.zip
這是從紅門這是一個公司,使偉大的SQL Server工具,它是免費的,這是非常值得的下載和閱讀時間。