programing

저장 프로시저의 실행 계획을 표시하려면 어떻게 해야 합니까?

minimums 2023. 8. 11. 21:39
반응형

저장 프로시저의 실행 계획을 표시하려면 어떻게 해야 합니까?

쿼리에 대한 예상 실행 계획(Management Studio 9.0)을 문제 없이 볼 수 있지만 저장 프로시저와 관련하여 ALTER 화면에서 코드를 복사하여 쿼리 창에 붙여넣지 않고는 이를 수행하는 쉬운 방법을 찾을 수 없습니다. 그렇지 않으면 ALTER에 대한 계획이 표시되고 절차가 표시되지 않습니다.이 작업을 수행한 후에도 입력 정보가 누락되어 있으므로 이를 신고해야 합니다.

저장 프로시저에서 이 작업을 더 쉽게 수행할 수 있는 방법이 있습니까?

편집: 저는 방금 효과가 있을 수 있는 것을 생각했지만 잘 모르겠습니다.

예상 실행 계획을 실행할 수 있습니까?

exec myStoredProc 234
SET SHOWPLAN_ALL ON
GO

-- FMTONLY will not exec stored proc
SET FMTONLY ON
GO

exec yourproc
GO

SET FMTONLY OFF
GO

SET SHOWPLAN_ALL OFF
GO

저장 프로시저 이름을 선택하고(쿼리 창에 입력하기만 하면 됨) 마우스 오른쪽 버튼을 클릭한 다음 SQL Server 관리 스튜디오의 도구 모음에서 '예상 실행 계획 표시' 버튼을 선택합니다.저장 프로시저 코드를 열 필요가 없습니다.절차 이름만 선택해야 합니다.

호출된 프로시저 내의 저장 프로시저에 대한 계획도 그래픽 형식으로 표시됩니다.

SQL Management Studio 2008에서 저장 프로시저를 실행할 때 메뉴에서 쿼리 -> 실제 실행 계획 포함을 클릭할 수 있습니다. 이는 도구 모음에서도 마찬가지입니다.

의견을 읽은 후 실행하는 것이 문제가 되는 것으로 보이며 이 문제를 해결하기 위해 저장 프로시저 실행을 마지막에 롤백하는 트랜잭션으로 포장할 것을 권장합니다.

사용하다

SET SHOWPLAN_ALL ON
Go
exec myStoredProc 234
GO
SET SHOWPLAN_ALL OFF
GO

http://msdn.microsoft.com/en-us/library/aa259203.aspx 을 참조하십시오. tmp 테이블을 사용하지 않는 한 이것이 작동할 것이라고 생각합니다.

답변이 얼마 전에 제출된 것으로 알고 있지만 아래 쿼리가 유용합니다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT  [ProcedureName]          =   OBJECT_NAME([ps].[object_id], [ps].[database_id]) 
       ,[ProcedureExecutes]      =   [ps].[execution_count] 
       ,[VersionOfPlan]          =   [qs].[plan_generation_num]
       ,[ExecutionsOfCurrentPlan]    =   [qs].[execution_count] 
       ,[Query Plan XML]         =   [qp].[query_plan]  

FROM       [sys].[dm_exec_procedure_stats] AS [ps]
       JOIN [sys].[dm_exec_query_stats] AS [qs] ON [ps].[plan_handle] = [qs].[plan_handle]
       CROSS APPLY [sys].[dm_exec_query_plan]([qs].[plan_handle]) AS [qp]
WHERE   [ps].[database_id] = DB_ID() 
       AND  OBJECT_NAME([ps].[object_id], [ps].[database_id])  = 'TEST'

저장 프로시저의 실제 실행 계획을 얻는 방법은 여러 가지가 있습니다.

SELECT
qp.query_plan, 
SQLText.text
FROM sys.dm_exec_cached_plans AS CP
 CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
 CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
 WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'

프로덕션 서버의 데이터 통계를 사용하여 운영 서버의 계획을 살펴보면 데이터 세트가 더 작은 개발 상자와는 다른 계획이 표시될 수 있습니다.

쿼리 캐시에 따라 절차가 얼마나 자주 실행되는지와 같은 훨씬 더 많은 데이터가 있습니다.

SELECT
    qp.query_plan, 
    CP.usecounts as [Executed], 
    DB_name(QP.dbid) as [Database],
    OBJECT_NAME(QP.objectid) as [Procedure],
    SQLText.text as [TSQL],
    so.create_date as [Procedure Created],
    so.modify_date as [Procedure  Modified]
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
join sys.objects as so on so.[object_id]=QP.objectid
WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'

XML 쿼리 계획(두 쿼리의 첫 번째 열)에는 실행 계획의 XML이 포함되어 있어 SSMS에서 실행 계획을 클릭하고 실제 계획을 볼 수 있을 뿐만 아니라 인덱스 스캔이나 "신의 금지" 테이블 스캔과 같이 원하지 않는 항목을 검색할 수도 있습니다.

SELECT
    qp.query_plan, 
    CP.usecounts as [Executed], 
    DB_name(QP.dbid) as [Database],
    OBJECT_NAME(QP.objectid) as [Procedure],
    SQLText.text as [TSQL],
    so.create_date as [Procedure Created],
    so.modify_date as [Procedure  Modified]
FROM sys.dm_exec_cached_plans AS CP
CROSS APPLY sys.dm_exec_sql_text( plan_handle)AS SQLText
CROSS APPLY sys.dm_exec_query_plan( plan_handle)AS QP
join sys.objects as so on so.[object_id]=QP.objectid
WHERE objtype = 'Proc' and cp.cacheobjtype = 'Compiled Plan'
and cast(qp.query_plan as nvarchar(max)) like '%loop%'

XML을 문자열로 캐스팅한 다음 와일드카드 검색을 수행하는 매우 잘못된 방법을 사용하여 샘플을 추출했지만 XML 쿼리는 대부분 매일 수행하는 작업이 아니며 문자열 와일드카드는 누구나 쉽게 사용할 수 있습니다.

쿼리 메뉴에서 실제 실행 계획 표시를 활성화한 상태에서 관리 스튜디오(또는 쿼리 분석기)에서 저장 프로시저를 실행하면 저장 프로시저를 실행한 후 계획이 표시됩니다.실행할 수 없는 경우 예상 실행 계획을 표시합니다(내 경험으로는 종종 정확도가 떨어집니다).

프로파일러를 사용하여 실행 계획을 볼 수도 있습니다.성능: 계획 통계 프로파일 표시 옵션을 포함하고 열에 이진 데이터를 포함해야 합니다.

그런 다음 쿼리 또는 프로시저를 실행하고 실행 계획을 볼 수 있습니다.

편집

프로파일러를 사용할 수 없고 다른 창을 열고 싶지 않다면 저장된 프로시저의 시작 부분에 주석 블록을 포함하는 것이 좋습니다.예를 들어 다음과 같이 가정합니다.

/* 
     Description: This procedure does XYZ etc...
     DevelopedBy: Josh
     Created On:  4/27/09

     Execution: exec my_procName N'sampleparam', N'sampleparam'
*/

ALTER PROCEDURE  my_procName
   @p1 nvarchar(20),
   @p2 nvarchar(20)

AS

이렇게 하면 실행 목적만 강조 표시하고 실행 계획 표시를 설정할 수 있습니다.그리고 실행합니다.

여기 스크린샷이 있습니다.어디를 찾아야 할지 찾는데 시간이 좀 걸렸습니다.

enter image description here

언급URL : https://stackoverflow.com/questions/794411/how-can-i-display-the-execution-plan-for-a-stored-procedure

반응형