SQL Server如何查看存儲過程的執行計劃

来源:https://www.cnblogs.com/kerrycode/archive/2019/06/28/11102040.html
-Advertisement-
Play Games

有時候,我們需要查看存儲過程的執行計劃,那麼我們有什麼方式獲取存儲過程的歷史執行計劃或當前的執行計劃呢? 下麵總結一下獲取存儲過程的執行計劃的方法。 1:我們可以通過下麵腳本查看存儲過程的執行計劃,但是有時候,你會發現這種方式並不總是能夠獲取到存儲過程的執行計劃。 SELECT d.object_i... ...


有時候,我們需要查看存儲過程的執行計劃,那麼我們有什麼方式獲取存儲過程的歷史執行計劃或當前的執行計劃呢? 下麵總結一下獲取存儲過程的執行計劃的方法。

 

 

1:我們可以通過下麵腳本查看存儲過程的執行計劃,但是有時候,你會發現這種方式並不總是能夠獲取到存儲過程的執行計劃。

 

SELECT
        d.object_id ,
        DB_NAME(d.database_id) DBName ,
        OBJECT_NAME(object_id, database_id) 'SPName' ,
        d.cached_time ,
        d.last_execution_time ,
        d.total_elapsed_time/1000000    AS total_elapsed_time,
        d.total_elapsed_time / d.execution_count/1000000 
                                        AS [avg_elapsed_time] ,
        d.last_elapsed_time/1000000     AS last_elapsed_time,
        d.execution_count ,
        d.total_physical_reads ,
        d.last_physical_reads ,
        d.total_logical_writes ,
        d.last_logical_reads ,
        et.text SQLText ,
        eqp.query_plan executionplan
FROM    sys.dm_exec_procedure_stats AS d
CROSS APPLY sys.dm_exec_sql_text(d.sql_handle) et
CROSS APPLY sys.dm_exec_query_plan(d.plan_handle) eqp
WHERE   OBJECT_NAME(object_id, database_id) = 'xxxx'
ORDER BY [total_worker_time] DESC;

 

 

 

有時候使用這種方式並不能獲取存儲過程的執行計劃,腳本查詢出來的結果,query_plan欄位為NULL值,那麼為什麼是NULL值呢?這個是因為有一些限制或條件的緣故,官方文檔的解釋如下:

 

Under the following conditions, no Showplan output is returned in the query_plan column of the returned table for sys.dm_exec_query_plan:

 

·         If the query plan that is specified by using plan_handle has been evicted from the plan cache, the query_plan column of the returned table is null. For example, this condition may occur if there is a time delay between when the plan handle was captured and when it was used with sys.dm_exec_query_plan.

 

·         Some Transact-SQL statements are not cached, such as bulk operation statements or statements containing string literals larger than 8 KB in size. XML Showplans for such statements cannot be retrieved by using sys.dm_exec_query_plan unless the batch is currently executing because they do not exist in the cache.

 

·         If a Transact-SQL batch or stored procedure contains a call to a user-defined function or a call to dynamic SQL, for example using EXEC (string), the compiled XML Showplan for the user-defined function is not included in the table returned by sys.dm_exec_query_plan for the batch or stored procedure. Instead, you must make a separate call to sys.dm_exec_query_plan for the plan handle that corresponds to the user-defined function.

 

When an ad hoc query uses simple or forced parameterization, the query_plan column will contain only the statement text and not the actual query plan. To return the query plan, call sys.dm_exec_query_plan for the plan handle of the prepared parameterized query. You can determine whether the query was parameterized by referencing the sql column of the sys.syscacheobjects view or the text column of the sys.dm_exec_sql_text dynamic management view.

 

 

在以下情況下,sys.dm_exec_query_plan的返回表的query_plan列為空值(query_plan列中未返回Showplan輸出):

 

·         通過使用plan_handle查詢指定的查詢計劃(query plan),如果plan_handle已從計劃緩存中踢出(逐出),返回的表的query_plan列為null 例如,如果在捕獲計劃句柄與將其與sys.dm_exec_query_plan一起使用之間存在時間延遲,則可能會出現這種情況。

 

·         有些Transact-SQL語句不會cached,例如大容量操作語句(bulk operation statements)或包含大於8 KB的字元串大小的SQL語句。無法使用sys.dm_exec_query_plan檢索此類語句的XML Showplans,除非批處理當前正在執行,因為它們不存在於緩存中。

 

·         如果Transact-SQL批處理或存儲的過程包含對用戶定義函數的調用或執行動態SQL,例如使用 EXEC (字元串),則用戶定義函數的已編譯XML Showplan不包含在返回的表中通過sys.dm_exec_query_plan獲取批處理或存儲過程。相反,您必須單獨調用sys.dm_exec_query_plan以獲取與用戶定義函數對應的計劃句柄。

 

當即席查詢使用簡單或強制參數化時,query_plan列將包含僅語句文本,而不是實際查詢計劃。 若要返回查詢計劃,請調用sys.dm_exec_query_plan準備參數化查詢的計劃句柄。 您可以確定查詢是否已參數化通過引用sql的列sys.syscacheobjects視圖或文本列sys.dm_exec_sql_text動態管理視圖。

 

註意:sys.dm_exec_query_plan返回的是實際執行計劃。

 

 

2:使用SET SHOWPLAN_ALL ON 和SET SHOWPLAN_XML ON獲取存儲過程的執行計劃。

 

如下所示,在AdventureWorks2014資料庫中,查看存儲過程[dbo].[uspGetEmployeeManagers] 的執行計劃

 

 

SET SHOWPLAN_ALL ON

GO

SET FMTONLY ON

GO

 

EXEC dbo].[uspGetEmployeeManagers] 242;

GO

SET FMTONLY OFF

GO

 

SET SHOWPLAN_ALL OFF

GO

 

 

SET SHOWPLAN_ALL ON

GO

 

EXEC [dbo].[uspGetEmployeeManagers] 242;

GO

SET SHOWPLAN_ALL OFF;

GO

 

 

SET SHOWPLAN_XML ON

GO

 

EXEC [dbo].[uspGetEmployeeManagers] 242;

GO

SET SHOWPLAN_XML OFF;

GO

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們公司2019年web開發已遷移至.NET core,目前有部分平臺隨著用戶量增加,單一資料庫部署已經無法滿足我們的業務需求,一直在尋找EF CORE讀寫分離解決方案,目前在各大技術論壇上還沒找到很好的方案,根據之前找到的讀寫分離方案,綜合目前EF core 的能力,自己編寫了一套EF core實 ...
  • MongoDB和關係型資料庫的對應關係 關係資料庫示例: MongoDB對應的: 資料庫(database) 一個MongoDB中可以建立多個資料庫,這些資料庫是相互獨立的,有自己的集合和許可權。不同的資料庫使用不同的文件存儲(不存儲在一個文件中)。 MongoDB預設有4個資料庫: admin: 從 ...
  • 簡述 博主最近因工作任務纏身,都無暇顧及到我的這片自留地了。前段時間稍有空閑,花了較多的精力學習《啊哈演算法》,從中學習到很多之前沒有太註重的內容,收益頗豐。但是這些演算法題目還沒有看完,等後面有時間了,還需重新自我溫習一下前面所寫的內容,並且繼續耕耘後面的演算法知識。 今天稍微有點時間,總結一下博主近期 ...
  • 資料庫概念 資料庫(Database)是按照數據結構來組織、存儲和管理數據的建立在電腦存儲設備上的倉庫。 資料庫:存儲數據的倉庫 資料庫分類 網路資料庫 網路資料庫是指把資料庫技術引入到電腦網路系統中,藉助於網路技術將存儲於資料庫中的大量信息及時發佈出去;而電腦網路藉助於成熟的資料庫技術對網路 ...
  • 伺服器配置文件分析 bin目錄下的mongod.cfg是伺服器的配置文件,文件中主要的配置參數: 1、資料庫文件的存放位置 2、伺服器日誌文件的存放位置 3、預設的IP地址、埠號 設置密碼 預設情況下,MongoDB的伺服器地址是127.0.0.1,埠號是27017,存儲資料庫管理員信息的adm ...
  • 本篇博文簡單介紹Elasticsearch中term詞條檢索、prefix首碼檢索、wildcard通配符檢索、fuzzy糾錯檢索, 以及boost分數提升等高級檢索的用法, 最後通過複雜檢索的示例, 綜合演示這些檢索語法. ...
  • 1.需求描述 我們知道Windows Cluster 都是多節點的,當虛擬IP漂移的時候,一般都是從一個節點漂移到另外一個節點。如果可以及時捕捉到舊節點信息是什麼、新節點信息是什麼對我們提供高可用的資料庫服務很重要,只有捕捉到這些信息後才可以進一步檢查相應的Job、賬號,甚至是調整相應的應用服務等。 ...
  • 一方關聯多方查詢時執行否定篩選,結果包含未通過篩選的項。 我們規定一方為父,多方為子,我們希望子未通過篩選時,結果也不出現對應的父。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...