1. 程式人生 > >《T-SQL查詢》讀書筆記Part 2.執行計劃

《T-SQL查詢》讀書筆記Part 2.執行計劃

一、關於執行計劃

執行計劃是優化器生成的用於確定如何處理一個給定查詢的“工作計劃”。一個計劃包含一組運算子,通常按照特定的順序來應用這些運算子。此外,一些運算子可以在它們之前的運算子還在處理時被應用(即不一定是完全序列),還有一些運算子也有可能被應用多次。

二、圖形化執行計劃

2.1 SSMS中的圖形化執行計劃

  在SSMS(SQL Server Management Studio)中,有兩種圖形化的執行計劃可供選擇。一種是估計執行計劃(Ctrl+L鍵),另一種是實際執行計劃(Ctrl+M鍵)。兩種計劃通常都是一樣的,只是執行時間點不同。估計查詢計劃是在查詢執行之前生成,而實際執行計劃則是在查詢輸出的同時得到的。

2.2 圖形化執行計劃例項

  Step1.示例查詢

(1)假設我們有一張Orders表,裡面有100w行訂單資料,從2005年開始到2009年。

  

  (2)待分析的查詢語句

-- 圖形化執行計劃查詢示例
SELECT custid, empid, shipperid, COUNT(*) AS numorders
FROM dbo.Orders
WHERE orderdate >= '20080201'
  AND orderdate < '20080301'
GROUP BY CUBE(custid, empid, shipperid);
GO

  Step2.估計的執行計劃檢視(選中SQL語句按Ctrl+L)

  

  當我們將游標移動到某個運算子上面時,可以得到該運算子返回的估計行數和開銷。箭頭的粗細與源運算子返回的行數是成正比的。所以,重點關注比較粗的箭頭,它們可能預示著效能問題。

  

  Step3.實際的執行計劃(先選中“包括實際的執行計劃”,再執行該查詢,即可同時得到查詢的輸出和實際的計劃)

  

    

  這時再把游標移到某個運算子,看到的會變為“實際行數”。

  

  Step4.縮放到合適的大小=>如果得到了一個無法適合螢幕顯示的計劃時,可以使用一個很酷的功能,叫做縮放到合適大小。(點選滑鼠右鍵出現選單,選擇即可)

  

  點選後,執行計劃會變為如下圖所示:

  

  Step5.執行計劃是由運算子組成的一個樹狀結構,在圖形化計劃中,是從右到左從上到下的順序來表示的。在這個例子中,聚集索引查詢(Clustered Index Seek)是資料流的第一個運算子,生成的輸出傳到樹中的下一個運算子-表假離線(Eager Spool),以此類推。

  

  我們需要注意與每個運算子相關聯的開銷百分比,這個值是某個運算子的開銷佔查詢全部開銷的百分比,由優化器估算。這裡,我們需要多留意一下百分比值比較高的運算子,重點對這些運算子進行優化

  

  此外,當我們將游標放在一個運算子上面時,其中有一項叫做“估計子樹大小(Estimated Subtree Cost)”,這個值代表從當前運算子開始的子樹的累計估計大小。比如,這裡我們通過將游標移動到最左邊的SELECT運算子,即根節點,可以看到整個查詢的估計開銷(因為其子樹代表了整個查詢)。

  

2.3 比較多個查詢的開銷

  圖形化執行計劃的另一個有用的功能就是可以方便地比較多個查詢的開銷。

  假設我們想比較以下幾個實現類似目標的查詢的開銷:

SELECT custid, orderid, orderdate, empid, filler
FROM dbo.Orders AS O1
WHERE orderid =
  (SELECT TOP (1) O2.orderid
   FROM dbo.Orders AS O2
   WHERE O2.custid = O1.custid
   ORDER BY O2.orderdate DESC, O2.orderid DESC);

SELECT custid, orderid, orderdate, empid, filler
FROM dbo.Orders
WHERE orderid IN
(
  SELECT
    (SELECT TOP (1) O.orderid
     FROM dbo.Orders AS O
     WHERE O.custid = C.custid
     ORDER BY O.orderdate DESC, O.orderid DESC) AS oid
  FROM dbo.Customers AS C
);

SELECT A.*
FROM dbo.Customers AS C
  CROSS APPLY
    (SELECT TOP (1) 
       O.custid, O.orderid, O.orderdate, O.empid, O.filler
     FROM dbo.Orders AS O
     WHERE O.custid = C.custid
     ORDER BY O.orderdate DESC, O.orderid DESC) AS A;

WITH C AS
(
  SELECT custid, orderid, orderdate, empid, filler,
    ROW_NUMBER() OVER(PARTITION BY custid
                      ORDER BY orderdate DESC, orderid DESC) AS n
  FROM dbo.Orders
)
SELECT custid, orderid, orderdate, empid, filler
FROM C
WHERE n = 1;
GO

  在SSMS中選中他們,並請求圖形化執行計劃(估計的或實際的)。這裡,我們將會得到如下圖所示的計劃。

  

  從圖中可以看到,在每個計劃頂部都會有一個百分比,表示該查詢的開銷佔整個批處理總開銷的百分比,這裡Query1=>34%,Query2=>19%,Query3=>28%,Query4=>20%,可以看出,Query1的查詢開銷最大,需要進一步檢查其效能。

參考資料

  

  [美] Itzik Ben-Gan 著,成保棟 譯,《Microsoft SQL Server 2008技術內幕:T-SQL查詢》

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

T-SQL查詢讀書筆記Part 2.執行計劃

一、關於執行計劃 執行計劃是優化器生成的用於確定如何處理一個給定查詢的“工作計劃”。一個計劃包含一組運算子,通常按照特定的順序來應用這些運算子。此外,一些運算子可以在它們之前的運算子還在處理時被應用(即不一定是完全序列),還有一些運算子也有可能被應用多次。 二、圖形化執行計劃 2.1 SSMS中

T-SQL查詢讀書筆記Part 1.邏輯查詢處理知多少

一、關於T-SQL   T-SQL是ANSI和ISO SQL標準的MS SQL擴充套件,其正式名稱為Transact-SQL,但一般程式設計師都稱其為T-SQL。 二、邏輯查詢處理各個階段 2.1 邏輯查詢處理流程總覽 2.2 邏輯查詢處理階段解釋   (1)FROM:標識出查詢的來源表,處理表

T-SQL查詢讀書筆記Part 3.索引的基本知識

索引優化是查詢優化中最重要的一部分,索引是一種用於排序和搜尋的結構,在查詢資料時索引可以減少對I/O的需要;當計劃中的某些元素需要或是可以利用經過排序的資料時,也會減少對排序的需要。某些方面的優化可以適度提高效能,而索引優化經常可以大幅度地提高查詢效能。 一、表和索引的結構 1.1 頁和區   頁是MS

崔華基於oracle的SQL優化讀書筆記(一)如何得到真實的執行計劃

hash mes getting binary oracl only 中文 fun roc ---恢復內容開始--- 得到目標SQL的執行計劃,大致有以下四種方式: 1.explain plan 命令 2.DBMS_XPLAN包 3.SQLPLUS中的autotrace開關

執行緒處理慢sql查詢筆記~

多執行緒處理慢sql查詢以及List(Array)的拆分 系統資料量不大,但是訪問速度特別慢,使用多執行緒優化一下!!! 優化結果:訪問時間縮短了十幾秒  25s --> 8s 一、List的拆分:Iterables.partition 注意: 引入的包為google名下的   &n

從join on和where執行順序認識T-SQL查詢處理執行順序

SQL語句中join連表時on和where後都可以跟條件,那麼對查詢結果集,執行順序,效率是如何呢? 通過查詢資料發現:區別:on是對中間結果進行篩選,where是對最終結果篩選。執行順序:先進行on的過濾, 而後才進行join。效率:如果是inner join, 放o

《java並發編程實戰》讀書筆記5--任務執行, Executor框架

調度 生產 頁面 acc 消費者模式 退出 融合 可能 第一篇 6.1 在線程中執行任務 第一步要找出清晰的任務邊界。大多數服務器應用程序都提供了一種自然的任務邊界選擇方式:以獨立的請求為邊界。 -6.6.1 串行地執行任務 最簡單的任務調度策略是在單個線程中串行地執行各項

《從0到1》讀書筆記2章&quot;像1999 年那樣狂歡&quot;第1記:小結及詞匯解析

content 高新 1.8 匯率 穩定 盈利模式 fun csdn 外匯 小結 本章的目的應該是通過90年代末的互聯網泡沫的背景,成因。影響,以及教訓來教誡人們,在全部人都瘋狂的拋身於洪流熱潮之中時,我們要冷靜的思考辨識出那些不切實際的大眾觀點,

T-SQL查詢進階--深入淺出視圖

bsp images select語句 執行 lte 告訴 企業 contact 需要 簡介 視圖可以看作定義在SQL Server上的虛擬表.視圖正如其名字的含義一樣,是另一種查看數據的入口.常規視圖本身並不存儲實際的數據,而僅僅存儲一個Select語句和所

T-SQL 查詢分區詳細信息和行計數

function mes art dex sys prop sch pro left join --paritioned table and index detailsSELECT OBJECT_NAME(p.object_id) AS ObjectName,

T-SQL查詢語句

select t-sql 多表查詢 表達式 楊書凡 SQL語言中最主要、最核心的部分是它的查詢功能。查詢語句用來對已經存在於數據庫的數據按照特定的組合、條件表達式或次序進行檢索,使用SELECT語句來完成。使用SELECT查詢數據1. SELECT語法結構 T-SQL中查詢基

UML精粹讀書筆記2

但是 一個 行動 業務場景 開發流程 能力 幫助 流程 中間 現在大概是以一次看一章,每周看一章的速度來進行的,工作日自己太懶,沒有花時間去思考和行動。 這次看的是第二章,開發過程。 作者講了很多,但是基本都是以一個開發人員的視角來描述的。 我很詫異的是,感覺很多國外開

《Linux系統編程手冊》讀書筆記——第2章基本概念

守護 setenv 代碼 不存在 export 層級 用途 運行時 創建 操作系統的核心--內核 內核的職責 進程調度:Linux屬於搶占式多任務操作系統,多個進程可同時駐留於內存,且每個進程都能獲得對CPU的使用權。哪些進程獲得對CPU的使用,以及每個進程能使用多長時間

讀書筆記——1.2.16

開發 想是 如果 專業 意義 說明 一起 關於 AD   首先是第一章,書中例舉出了從小孩玩的紙飛機,到“飛屋”,到萊特兄弟的飛機最後到我們看到的飛機。我想到的是,有的人從興趣出發,覺得某些項目也好,工程也好,需要去實現。有的人放棄了,止步於紙飛機,有的人堅持了,做出了航模

T-SQL查詢進階--理解SQL Server中索引的概念,原理以及其他

工具 def microsoft 需要 blog b- eve 實現 中一 簡介 在SQL Server中,索引是一種增強式的存在,這意味著,即使沒有索引,SQL Server仍然可以實現應有的功能。但索引可以在大多數情況下大大提升查詢性能,在OLAP

T-SQL查詢:WITH AS 遞歸計算某部門的所有上級機構或下級機構

area t-sql union sel lec where 需要 _id with as drop table #Area; CREATE TABLE #Area ( id INT NOT NULL, city_name NVARCHAR(100)

T-SQL查詢進階--SQL Server中的事務與鎖

錯誤 span 設備 限制 數據復制 默認 base 數據 insert 為什麽需要鎖在任何多用戶的數據庫中,必須有一套用於數據修改的一致的規則,當兩個不同的進程試圖同時修改同一份數據時,數據庫管理系統(DBMS)負責解決它們之間潛在的沖突。任何關系數據庫必須支持事務的AC

SQL Server進階(一)T-SQL查詢和編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景

多線程處理慢sql查詢筆記~

拆分 集合 引入 form executor lists life 訪問速度 查詢 多線程處理慢sql查詢以及List(Array)的拆分 系統數據量不大,但是訪問速度特別慢,使用多線程優化一下!!! 優化結果:訪問時間縮短了十幾秒 25s --> 8s 一、Lis

《CLR Via C#》讀書筆記:24.執行時序列化

一、什麼是執行時序列化 序列化的作用就是將物件圖(特定時間點的物件連線圖)轉換為位元組流,這樣這些物件圖就可以在檔案系統/網路進行傳輸。 二、序列化/反序列化快速入門 一般來說我們通過 FCL 提供的 BinaryFormatter 物件就可以將一個物件序列化為位元組流進行儲存,或者通過該 Format