1. 程式人生 > >瞭解Sql Server的執行計劃 看懂SqlServer查詢計劃 程式設計師眼中的 SQL Server-執行計劃教會我如何建立索引?

瞭解Sql Server的執行計劃 看懂SqlServer查詢計劃 程式設計師眼中的 SQL Server-執行計劃教會我如何建立索引?

閱讀目錄

  前一篇總結了Sql Server Profiler,它主要用來監控資料庫,並跟蹤生成的sql語句。但是隻拿到生成的sql語句沒有什麼用,我們可以利用這些sql語句,然後結合執行計劃來分析sql語句的效能問題,這才是我們的最終目的,那麼如何使用執行計劃呢?我準備從以下幾點來總結。

  1. 如何啟動執行計劃
  2. 執行計劃結果要看什麼
  3. Sql Server的五種查詢方式
  4. 檢視更具體的執行過程
回到頂部

如何啟動執行計劃

  執行一條sql,並且在工具欄中選中'Include Actual Execution Plan'按鈕,此時就啟動了執行計劃,如下圖。

  

  Sql語句:  

複製程式碼
USE TSQLFundamentals2008;
GO

-- 查詢2006年7月1日到2007年7月31日的所有訂單,並按requireddate欄位排序
SELECT orderid,orderdate,requireddate,shippeddate,shipname,shipaddress FROM Sales.Orders WHERE orderdate>='20060701' AND orderdate<'20070801' ORDER BY requireddate;
複製程式碼

  執行查詢,可以在結果欄中看到執行計劃結果,如下圖。

  

回到頂部

執行計劃結果要看什麼

  執行計劃結果出來了,那我們要怎麼看呢?一般我們只需關注以下幾個引數。

  1. 哪一步開銷較高。開銷較高的地方說明這個地方查詢比較耗時。
  2. 哪些步驟所影響的資料行較多。這個可以通過連線線條的粗細來判斷。
  3. 每一步做了些什麼事情。
回到頂部

Sql Server的五種查詢方式

   要了解Sql Server的五種查詢方式之前,我們要弄明白兩個概念,Sql Server中的兩種索引,聚集索引和非聚集索引。【聚集索引】直接決定了記錄的存放位置,或者說,根據聚集索引可以直接獲取到該記錄,一般我們表的主鍵都是用聚集索引。【非聚集索引】則儲存了二個資訊,1.相應索引欄位的值。2.記錄對應聚集索引的位置(如果表沒有聚集索引則儲存記錄指標)。因此,如果能通過聚集索引來查詢記錄,則速度是最快的。

  下面是Sql Server查詢資料的五種方式,這對我們理解執行計劃非常重要。五種方式如下。

  1. 【Table Scan】:遍歷整個表來查詢匹配的資料行,速度最慢。
  2. 【Index Scan】:依據索引先從表中過濾出一部分記錄,然後再查詢所有匹配的資料行。查詢速度比Table Scan稍快。
  3. 【Index Seek】:依據索引,定位記錄的存放位置,然後再取得記錄,因此,其查詢速度比前面兩種都快。
  4. 【Clustered Index Scan】:按聚集索引(一般是主鍵)遍歷整個表,因為它的記錄就是按聚集索引來順序存放的。注意它與Table Scan的區別,其實它們都是進行全表掃描,只不過Table Scan是不帶索引的掃描,而Clustered Index Scan是按聚集索引掃描的。
  5. 【Clustered Index Seek】:聚集索引獲取記錄,它是直接拿到那條記錄,而沒有進行全表掃描,因此它的查詢速度是最快的。

  當我們檢視執行計劃結果的時候,如果看到【Table Scan】,說明這個表沒有建立任何索引,包括聚集索引。但往往看到更多的是【Clustered Index Scan】,表示該查詢還是掃描了速個表,只不過是按聚集索引,實際效果還是和【Table Scan】沒什麼區別,因此,這時候我們可能要考慮建立'組合欄位索引'。

回到頂部

檢視更具體的執行過程

  能過執行計劃的結果圖我們只能看出哪一塊比較耗時,但是看不到Sql Server具體是怎麼執行的。為了看得更明白,我們可以通過一條sql命令來檢視,如下程式碼。

SET STATISTICS PROFILE ON;

  執行結果除了返回資料集和執行計劃外,還返回了一個表顯示具體的執行過程,如下圖。

  這個結果我們重點要關注以下幾點:

  1. Stmt Text:所執行的步驟詳細描述,一般從最內層往外看。
  2. Rows:表示該執行步驟所產生的記錄數。
  3. Executes:表示某執行步驟被執行的記錄數。
回到頂部

參考資料

1,Fish Li的 看懂SqlServer查詢計劃

2,田園裡的蟋蟀的 程式設計師眼中的 SQL Server-執行計劃教會我如何建立索引?