MS SQL

MS SQL Monitoring ( 출처 SQLTAG 1,2권 )

darkturtle26 2018. 5. 4. 17:12

MS SQL Monitoring 

( 출처 SQLTAG 1,2권 )


출처 : SQLTAG BOOK 2권 

스크립트 : http://cafe.naver.com/sqlmvp/4710

내용 : MS SQL SNAPSHOT 작성  ( Oracle AWR 같은 것 ) 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
-- !!! 주의 
-- 1. ADhoc 쿼리가 많을 경우, 수집에 따른 부하가 매우 큼
-- 2. sql_handle 갯수가 많은 경우, 마찬가지로 수집에 따른 부하가 매우 큼 
-- 대안 : SQL TOP 100 개만 저장 
--------------------------------------------------------------------------------------------------------
--  현재 실행중인 쿼리 조회 스크립트
--------------------------------------------------------------------------------------------------------
SELECT     db_name(database_id) as db_info, session_id,    command, start_time, blocking_session_id, wait_type, wait_time, language,   y.*
FROM    sys.dm_exec_requests AS x
        CROSS APPLY
        master.sys.dm_exec_sql_text( x.sql_handle ) AS y
WHERE    session_id > 50
GO
 
-- 출처 : SQLTAG BOOK 2권 
-- 스크립트 : http://cafe.naver.com/sqlmvp/4710
-- SNPASHOT META 정보 조회 ( SNAPSHOT LIST UP ) 
EXEC dbo.SP_GET_SNAPSHOT_META
-- SNAPSHOT 저장 
-- 주의) SNAPSHOT INTERVAL 을 줄이면 줄일수록 SNAPSHOT 수집에 따른 부하, 사이즈 증가가 일어날수 있음 
EXEC DBO.SP_SET_SNAPSHOT 
-- SNAPSHOT 간 REPORT 수행 
-- 1)Top Query 2)Wait Event 3)File I/O 4)Object I/O 5)Object Size
EXEC DBO.SP_GET_SNAPSHOT 5,6
 
--------------------------------------------------------------------------------------------------------
-- 1. sys.dm_exec_query_stats ( Top Query )
--------------------------------------------------------------------------------------------------------
-- 지금까지 서버에서 실행된 쿼리에 대한 누적 통계 제공 V$SQL - DBA_HIST_SQLSTAT 
-- 현재 수행 중인 쿼리는 반영 되지 않는다 ( V$SQL 은 현재 수행 중인 쿼리도 반영됨  완료 후, V$SQL.EXECUTION = 1 로 업데이트 됨 )
-- worker_time  - CPU 
-- Elpased Time - 수행 시간 
-- physical read - 디스크에서 읽은 페이지 수
-- logical read - 버퍼 풀에서 읽은 페이지 수
select * from master.sys.dm_exec_query_stats ;
 
--------------------------------------------------------------------------------------------------------
-- 2. sys.dm_os_wait_stats ( Waits Event ) 
--------------------------------------------------------------------------------------------------------
-- 인스턴스 범위 지금까지 발생한 대기에 대한 누적 정보 제공 View 
-- 대기에는 리소스 대기, 시그널 대기 두가지 유형이 있다.
-- 시그널 대기 - CPU 대기 
-- 리소스 대기 - CPU 외 대기
-- wait_time_ms  - 시그널 대기 포함 
-- wait_time_ms - signal_wait_time_ms = 리소스 대기 
-- wait_time = resource_wait_time + singal_wait_time 
-- sys.dm_exec_request.status 1)Background 2)Running 3)Runnable ( 시그널 대기 ) 
--                            4) Sleeping  ( SQL Server 가 다음 명령어 오기를 대기 )
--                            5) Suspended ( 리소스 대기 , 요청된 리소스가 사용 가능한 상태가 되도록 대기 )
-- 
select * from sys.dm_os_wait_stats 
 
-- 해당 DMV 초기화
DBCC SQLPERF('sys.dm_os_wait_stats',CLEAR)
GO
 
CREATE DATABASE SQLTAGTESTDB ON PRIMARY 
( NAME = N'SQLTAGTESTDB'
,FILENAME = N'C:\SQL_DATA\SQLTAGTESTDB.MDF'
,SIZE = 1000000KB
,MAXSIZE = UNLIMITED
,FILEGROWTH =  1000000KB  )
LOG ON 
( NAME = N'TEST_LOG'
,FILENAME = N'C:\SQL_LOG\SQLTESTDB_LOG.LDF'
,SIZE = 10000KB
,MAXSIZE= 2048 GB
,FILEGROWTH = 100000KB );
GO
 
SELECT * FROM SYS.DM_OS_WAIT_STATS WHERE WAIT_TYPE ='PREEMPTIVE_OS_WRITEFILEGATHER';
 
-- SQLTAGTESTDB DB 삭제 
-- gpedit.msc 에서 해당 권한에 SQL Server 시작 계정 추가
-- 링크 - https://docs.microsoft.com/ko-kr/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows?view=sql-server-2017
-- SQLTAGTESTDB DB 다시 생성
-- PREEMPTIVE_OS_WRITEFILEGATHER 대기 다시 확인 
 
-- wait_type                        waiting_tasks_count    wait_time_ms    max_wait_time_ms    signal_wait_time_ms
-- PREEMPTIVE_OS_WRITEFILEGATHER    2                    128                116                    0
-- 반영 후 ( 개인 테스트로는 반영 전/후 WAIT(대기) 차이가 없음 ( 파일 사이즈를 더 크게 할걸... ) 
-- PREEMPTIVE_OS_WRITEFILEGATHER    2                    131                120                    0
 
--------------------------------------------------------------------------------------------------------
-- 3. sys.dm_io_virtual_file_stats ( File I/O ) 
--------------------------------------------------------------------------------------------------------
-- 누적값으로 데이터 및 로그 파일에 대한 I/O 통계
-- num_of_reads 읽기 횟수
-- num_of_bytes_read 읽은 총 바이트 수
-- io_stall_read_ms 읽은 시간( ms ) 
-- num_of_writes 쓰기 횟수
-- num_of_bytes_written 쓰기 총 바이트 수
-- io_stall_wirte_ms 쓰기 시간( ms )
-- io_stall i/o 총 시간( ms )
SELECT * FROM sys.dm_io_virtual_file_stats(null,null)  
 
 
 
--/**
-- * 쿼리 13. File I/O 조회 스크립트
--**/
 
 
USE [master]
GO
drop table dbo.TBL_TEST
go
CREATE TABLE dbo.TBL_TEST
(    A bigint identity(1,1)
,     B char(8000)
)
GO
 
INSERT INTO dbo.TBL_TEST ( B ) VALUES ( 'A' )
GO 1000
 
-- Buffer Pool 에 존재하는 데이터 페이즈를 제거하는 구문
-- 아직 Disk에 Write 되지 않은 Dirty Block 은 남아 있음 
DBCC dropcleanbuffers
GO
 
EXEC dbo.SP_SET_SNAPSHOT
GO
 
DBCC dropcleanbuffers
GO
 
SELECT COUNT(*FROM dbo.TBL_TEST
GO
 
EXEC dbo.SP_SET_SNAPSHOT
GO
 
EXEC dbo.SP_GET_SNAPSHOT_META
GO
-- 파일 I/O 관련 정렬 없음
EXEC dbo.SP_GET_SNAPSHOT 8,9
GO
 
--------------------------------------------------------------------------------------------------------
-- 4. sys.dm_io_virtual_file_stats ( File I/O ) 
--------------------------------------------------------------------------------------------------------
--  DB Object(Index) 의 IO, 잠금, 래치 등 통계정보를 제공하는 View
 
SELECT *
FROM    SYS.dm_db_index_operational_stats(null,null,null,null
GO
-- 앞 테스트 결과 다시 REPORT 만 다시 조회
-- leaf_insert_count DESC 
EXEC dbo.SP_GET_SNAPSHOT 8,9
GO
 
 
--------------------------------------------------------------------------------------------------------
-- 5. dbo.sysobject, dbo.sysindexes(Object Size)
--------------------------------------------------------------------------------------------------------
-- Database Level VIew
-- 
USE MASTER
GO
 
EXEC dbo.SP_GET_SNAPSHOT_META
GO
 
INSERT INTO TBL_TEST( B) VALUES ('A')
GO 2000
 
EXEC dbo.SP_SET_SNAPSHOT
GO
 
EXEC dbo.SP_GET_SNAPSHOT_META 
GO
-- 
-- last_reserved DESC 정렬 결과 
EXEC dbo.SP_GET_SNAPSHOT 9,10 
GO
cs