반응형

-- tempdb 의 I/O 관련 장애처리


CREATE DATABASE DBA

GO


USE DBA

GO


-- DROP TABLE dbo.TBL_ANALYSIS_MONITOR_TEMPDB

-- GO

CREATE TABLE dbo.TBL_ANALYSIS_MONITOR_TEMPDB

(

Event_Date datetime -- 로깅 시작

, Event_Idx int identity -- 중복방지 자동증가값

, Task_UserObj_Alloc_Cnt int -- 유저오브젝트 페이지 할당수

, Task_UserObj_Dealloc_Cnt int -- 유저오브젝트 페이지 해제수

, Task_Internal_Alloc_Cnt int -- 내부오브젝트 페이지 할당수

, Task_Internal_Dealloc_Cnt int -- 내부오브젝트 페이지 해제수

, Degree_of_Parallelism smallint -- 병렬처리수준

, Database_ID int -- DB_ID

, User_ID int -- 실행 유저 ID

, SQL_Handle varbinary(64) -- 후에 추적 가능하도록 로깅

, Plan_Handle varbinary(64) -- 후에 추적 가능하도록 로깅

, SQL_Text100 nvarchar(100) -- 핸들 조인 안될경우 대비

, CONSTRAINT CPK__TBL_ANALYSIS_MONITOR_TEMPDB__01 PRIMARY KEY CLUSTERED (Event_Date, Event_Idx)

);

GO


IF object_id('dbo.USP_TEMP_IO_GETTER') IS NULL

EXEC ('CREATE PROC dbo.USP_TEMP_IO_GETTER AS SELECT 1')

GO


ALTER PROCEDURE dbo.USP_TEMP_IO_GETTER

(

@pRoop_Cnt int = 60

)

AS

BEGIN

SET NOCOUNT ON;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;


DECLARE @vDate_Time datetime, @vCnt int = 0


WHILE @vCnt < @pRoop_Cnt

BEGIN

SELECT @vDate_Time = GETDATE(), @vCnt += 1;


WITH cteSU AS (

SELECT TOP 10

session_id

, request_id

, SUM(user_objects_alloc_page_count) as [userobj_alloc_cnt]

, SUM(user_objects_dealloc_page_count) as [userobj_dealloc_cnt]

, SUM(internal_objects_alloc_page_count) as [internal_alloc_cnt]

, SUM(internal_objects_dealloc_page_count) as [internal_dealloc_cnt]

, COUNT(session_id) as [degree_of_parallelism]

FROM tempdb.sys.dm_db_task_space_usage

WHERE database_id = 2

AND (user_objects_alloc_page_count > 0 OR internal_objects_alloc_page_count > 0)

AND session_id <> @@spid

AND session_id > 50

GROUP BY session_id, request_id

ORDER BY SUM(user_objects_alloc_page_count)

+ SUM(internal_objects_alloc_page_count) DESC

)

INSERT INTO DBA.dbo.TBL_ANALYSIS_MONITOR_TEMPDB

(Event_Date

, Task_UserObj_Alloc_Cnt

, Task_UserObj_Dealloc_Cnt

, Task_Internal_Alloc_Cnt

, Task_Internal_Dealloc_Cnt

, Degree_of_Parallelism

, Database_ID

, User_ID

, SQL_Handle

, Plan_Handle

, SQL_Text100

)

SELECT GETDATE() AS event_date

, A.userobj_alloc_cnt

, A.userobj_dealloc_cnt

, A.internal_alloc_cnt

, A.internal_dealloc_cnt

, A.degree_of_parallelism

, ER.database_id

, ER.user_id

, ER.sql_handle

, ER.plan_handle

, LEFT(ST.text, 100)

FROM cteSU AS A 

INNER JOIN sys.dm_exec_requests AS ER

ON ER.session_id = A.session_id AND ER.request_id = A.request_id

OUTER APPLY sys.dm_exec_sql_text(ER.sql_handle) AS ST


WAITFOR DELAY '00:00:01'


END

END;

GO


SELECT ST.text as [SQL_Text]

, QP.query_plan as [Plan_XML]

, AMT.Max_Task_UserObj_Alloc_Cnt

, AMT.Max_Task_Internal_Alloc_Cnt

, AMT.Database_ID

, AMT.SQL_Text100

FROM (

SELECT TOP 10

SQL_Handle, Plan_Handle, Database_ID

, MAX(Task_UserObj_Alloc_Cnt) as [Max_Task_UserObj_Alloc_Cnt]

, MAX(Task_Internal_Alloc_Cnt) as [Max_Task_Internal_Alloc_Cnt]

, SQL_Text100

FROM DBA.dbo.TBL_ANALYSIS_MONITOR_TEMPDB

GROUP BY SQL_Handle, Plan_Handle, Database_ID, SQL_Text100

ORDER BY MAX(Task_UserObj_Alloc_Cnt) + MAX(Task_Internal_Alloc_Cnt) DESC

) AS AMT 

OUTER APPLY sys.dm_exec_sql_text(AMT.sql_handle) as ST

OUTER APPLY sys.dm_exec_query_plan(AMT.Plan_Handle) as QP

GO



EXEC dbo.USP_TEMP_IO_GETTER;

반응형

'연구개발 > DBA' 카테고리의 다른 글

리소스 잠금 및 리소스 확인  (0) 2015.09.07
RECOMPILE  (0) 2015.09.04
tempdb file read/write i/o 기록 확인  (0) 2015.08.31
tempdb 많이 사용하는 실행계획과 텍스트 반환  (0) 2015.08.31
SQL Server 메모리  (0) 2015.06.04

+ Recent posts