1 3 DBA SQL tuningdownload.microsoft.com/.../track1_DBA/1_3_DBA_SQL_tuning.pdf · 2018-10-16 ·...

57
아주 아주 특별한 특별한 SQL SQL 튜닝 튜닝 ㈜씨퀄로 김정선

Transcript of 1 3 DBA SQL tuningdownload.microsoft.com/.../track1_DBA/1_3_DBA_SQL_tuning.pdf · 2018-10-16 ·...

아주아주 특별한특별한 SQL SQL 튜닝튜닝㈜씨퀄로김정선

아주아주특별한특별한

Level Level Level Level 400400400400400400400400

개념개념개념개념및및및및100

중간중간중간중간수준수준수준수준

200고급고급고급고급수준수준수준수준

300전문가전문가전문가전문가

400400400400개념개념개념개념및및및및소개소개소개소개수준수준수준수준

선수지식불필요중간중간중간중간수준수준수준수준

100에더하여기술적세부사항설명고급고급고급고급수준수준수준수준

200에더하여능숙한사용경험, 아키텍처지식필요전문가전문가전문가전문가

수준수준수준수준

SINCE 2002SINCE 2002

SQL Server SpecialistSQL Server Specialist Member & LeadingMember & Leading

PASS KoreaPASS Korea MemberMember

Microsoft TechNet Microsoft TechNet Global Q/A Global Q/A Microsoft TechNet Microsoft TechNet Global Q/A Global Q/A

Blog Blog http://blog.naver.com/visualdbhttp://blog.naver.com/visualdb

TwitterTwitter Jungsun_KimJungsun_Kim

뉴호라이즌뉴호라이즌교육센터교육센터

왕눈이왕눈이

BlockSnifferBlockSniffer SQLRoadPerfmonSQLRoadPerfmon

단, 현장 기술 지원 요청 시 별도 비용이 청구됩니다.

새로운새로운시각시각

Level Level 400400

선입견선입견

탈탈피피

SELECTSELECT ContactIDContactID, , FirstNameFirstName, , LastNameLastName, , ModifiedDateModifiedDateFROMFROM AdventureWorks.Person.ContactAdventureWorks.Person.ContactWHEREWHERE FirstNameFirstName = = 'Ramesh''Ramesh'

정렬정렬 (Sort (Sort Warnings)Warnings)정렬정렬 (Sort (Sort Warnings)Warnings)

병렬병렬쿼리쿼리 ((Parallel QueryParallel Query))병렬병렬쿼리쿼리 ((Parallel QueryParallel Query))

CREATE TABLE CREATE TABLE dbo.SUPPLIERdbo.SUPPLIER((

S_SUPPKEYS_SUPPKEY intint UNIQUE UNIQUE ,, S_NATIONKEYS_NATIONKEY intint,, S_NATIONKEYS_NATIONKEY intint,, S_COMMNETS_COMMNET char(2000)char(2000)

))

SELECT SELECT S_SUPPKEY, S_NATIONKEY, S_COMMENTS_SUPPKEY, S_NATIONKEY, S_COMMENTFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEY < S_SUPPKEY < 30573057ORDER BY ORDER BY S_NATIONKEYS_NATIONKEY

11

22

SELECTSELECT S_SUPPKEYS_SUPPKEY, S_NATIONKEY, S_COMMENT, S_NATIONKEY, S_COMMENTFROMFROM dbo.SUPPLIERdbo.SUPPLIERWHEREWHERE S_SUPPKEY < S_SUPPKEY < 30583058ORDERORDER BYBY S_NATIONKEYS_NATIONKEY

SELECT S_SUPPKEYSELECT S_SUPPKEY, , S_NATIONKEY, S_COMMNETS_NATIONKEY, S_COMMNETFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEY < S_SUPPKEY < 30573057ORDER BY ORDER BY S_NATIONKEYS_NATIONKEY

11

22

298ms298ms

SELECTSELECT S_SUPPKEYS_SUPPKEY, , S_NATIONKEY, S_COMMNETS_NATIONKEY, S_COMMNETFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEY < S_SUPPKEY < 30583058ORDER BYORDER BY S_NATIONKEYS_NATIONKEY

484ms484ms

50%50%

50%50%

예상하위 트리비용 0.639147

예상행 수 3056.97

50%50%

예상하위 트리비용 0.639169

예상행 수 3057.97

SELECT S_SUPPKEYSELECT S_SUPPKEY, S_NATIONKEY, S_COMMNET, S_NATIONKEY, S_COMMNETFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE S_SUPPKEY < WHERE S_SUPPKEY < 30573057ORDER BY ORDER BY S_NATIONKEYS_NATIONKEY

11

22

테이블테이블 ‘SUPPLIER’. ‘SUPPLIER’. 검색검색 수수1, 1, 논리적논리적읽기읽기 수수 769769, ……, ……

SELECTSELECT S_SUPPKEYS_SUPPKEY, S_NATIONKEY, S_COMMNET, S_NATIONKEY, S_COMMNETFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEY < S_SUPPKEY < 30583058ORDER BYORDER BY S_NATIONKEYS_NATIONKEY

22

테이블테이블 ‘SUPPLIER’. ‘SUPPLIER’. 검색검색 수수1, 1, 논리적논리적읽기읽기 수수 769769, ……, ……

worktable

없음

11

22

DurationDuration CPUCPU ReadsReads WritesWrites

298298 2121 769769 00

DurationDuration CPUCPU ReadsReads WritesWrites

484484 3131 1,3521,352 00

SELECTSELECT session_idsession_id, status, , status, wait_typewait_typewait_typewait_typewait_typewait_typewait_typewait_type, , wait_timewait_timewait_timewait_timewait_timewait_timewait_timewait_timeFROMFROM sys.dm_exec_requestssys.dm_exec_requestsWHEREWHERE session_idsession_id = 54= 54

session_idsession_id StatusStatus wait_typewait_type wait_timewait_timesession_idsession_id StatusStatus wait_typewait_type wait_timewait_time

5454 suspendedsuspended IO_COMPLETIONIO_COMPLETION 2323

SELECT SELECT granted_memory_kbgranted_memory_kb,, used_memory_kbused_memory_kb,, max_used_memory_kbmax_used_memory_kb

FROM FROM sys.dm_exec_query_memory_grantssys.dm_exec_query_memory_grantsWHERE WHERE session_idsession_id = 54= 54WHERE WHERE session_idsession_id = 54= 54

granted_memory_kbgranted_memory_kb used_memory_kbused_memory_kb max_used_memory_kbmax_used_memory_kb

81928192 81928192 81928192

SELECT SELECT ** FROM FROM sys.dm_io_virtual_file_statssys.dm_io_virtual_file_stats((db_iddb_id((''tempdbtempdb'), 1)'), 1)

SELECT … WHERE S_SUPPKEY < SELECT … WHERE S_SUPPKEY < 30573057 …………

SELECT SELECT ** FROM FROM sys.dm_io_virtual_file_statssys.dm_io_virtual_file_stats((db_iddb_id((''tempdbtempdb'), 1)'), 1)

SELECT … WHERE S_SUPPKEY < SELECT … WHERE S_SUPPKEY < 30583058 …………

SELECT SELECT ** FROM FROM sys.dm_io_virtual_file_statssys.dm_io_virtual_file_stats((db_iddb_id((''tempdbtempdb'), 1'), 1))

11

22

SELECT SELECT ** FROM FROM sys.dm_io_virtual_file_statssys.dm_io_virtual_file_stats((db_iddb_id((''tempdbtempdb'), 1'), 1))

db_iddb_id num_of_readsnum_of_reads num_of_bytes_readnum_of_bytes_read num_of_writesnum_of_writes num_of_bytes_writtennum_of_bytes_written

22 2020 1,138,6881,138,688 22 16,38416,384

22 2020 1,138,6881,138,688 22 16,38416,384

22 117117 7,405,5687,405,568 9898 6,283,2646,283,264

11

22

메모리에적합하지않은정렬작업을나타냅니다.

…… SELECT 문에사용된 ORDER BY절등쿼리내의정렬작업만포함됩니다, by Profiler

행행수수 oror열열크기크기예측예측및및판단판단오류오류

====메모리메모리할당할당 오차오차

SELECTSELECT TOP TOP 100100 S_SUPPKEY, S_NATIONKEY, S_COMMENTS_SUPPKEY, S_NATIONKEY, S_COMMENTFROMFROM dbo.SUPPLIERdbo.SUPPLIERWHEREWHERE S_SUPPKEYS_SUPPKEY < 20000< 20000ORDERORDER BYBY S_NATIONKEYS_NATIONKEY

11

22

93ms93ms

SELECTSELECT TOPTOP 101101 S_SUPPKEY, S_NATIONKEY, S_COMMENTS_SUPPKEY, S_NATIONKEY, S_COMMENTFROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEYS_SUPPKEY << 2000020000ORDERORDER BYBY S_NATIONKEYS_NATIONKEY

939ms939ms

data file data file 개수개수

동일한동일한파일파일크기크기

CPU core CPU core 수수==

32 core?32 core?

for what?for what? tempdbtempdb과다과다동시동시할당할당병목병목==

have you?have you? ????????????==for what?for what? tempdbtempdb과다과다동시동시할당할당병목병목==

Sort Warnings Sort Warnings --파일이파일이많을수록많을수록손해손해??Sort Warnings Sort Warnings --파일이파일이많을수록많을수록손해손해??Sort Warnings Sort Warnings --파일이파일이많을수록많을수록손해손해??by Ramesh Meyyappanby Ramesh Meyyappan

Sort Warnings Sort Warnings --파일이파일이많을수록많을수록손해손해??by Ramesh Meyyappanby Ramesh Meyyappan

해결해결(solving)(solving)

1) 1) 그그쿼리쿼리쓰지쓰지마마??

2)2) ORDER BY ORDER BY 절절없애없애??

3)3)열열타입타입및및길이길이변경변경3)3)

4)4)인덱스인덱스튜닝튜닝

5)5)쿼리쿼리튜닝튜닝

…………

SELECTSELECT S_SUPPKEYS_SUPPKEY, S_NATIONKEY, S_NATIONKEY

, , CONVERT( CONVERT( varcharvarchar((50005000), S_COMMENT)), S_COMMENT)FROM FROM dbo.SUPPLIERdbo.SUPPLIER

22

FROM FROM dbo.SUPPLIERdbo.SUPPLIERWHERE WHERE S_SUPPKEY < 3058S_SUPPKEY < 3058ORDER BYORDER BY S_NATIONKEYS_NATIONKEY

정렬정렬대상대상집합집합크기크기조정조정

CREATE PROC CREATE PROC dbo.up_Reusedbo.up_Reuse ( ( @date @date datetimedatetime ))ASAS

SELECT ……SELECT ……FROM FROM Sales.SalesOrderDetailSales.SalesOrderDetail AS dAS dINNER INNER JOIN JOIN Sales.SalesOrderHeaderSales.SalesOrderHeader AS oAS o

ON ON d.SalesOrderIDd.SalesOrderID = = o.SalesOrderIDo.SalesOrderIDWHERE WHERE d.UnitPriced.UnitPrice > 0> 0WHERE WHERE d.UnitPriced.UnitPrice > 0> 0

AND AND o.OrderDateo.OrderDate >=>= @@datedateGROUP GROUP BY BY o.DueDateo.DueDate, , o.ShipDateo.ShipDateORDER ORDER BY BY o.ShipDateo.ShipDate DESCDESC

EXEC EXEC dbo.up_Reusedbo.up_Reuse ‘2004‘2004--0101--01’01’

EXEC EXEC dbo.up_Reusedbo.up_Reuse ‘‘20012001--0101--0101’’

Sort Sort WarningsWarningsvs.vs.vs.vs.

병렬병렬쿼리쿼리

Hash WarningHash Warning

(해시연산중해시재귀또는해시중단(해시재귀한도초과)이일어난경우발생합니다, by Profiler

Please tell me Please tell me What happened?What happened?What happened?What happened?How do I do?How do I do?

병렬쿼리병렬쿼리: 5,328ms: 5,328ms병렬쿼리병렬쿼리: 5,328ms: 5,328ms

직렬쿼리직렬쿼리: 1,088ms: 1,088ms직렬쿼리직렬쿼리: 1,088ms: 1,088ms

AAAAAAAA사사사사사사사사))))))))누적대기누적대기누적대기누적대기누적대기누적대기누적대기누적대기분석분석분석분석분석분석분석분석

대기대기유형유형 평균평균대기시간대기시간((msms)) 요청요청횟수횟수

CXPACKETCXPACKET 421421 234,501234,501

BBBBBBBB사사사사사사사사))))))))상세대기상세대기상세대기상세대기상세대기상세대기상세대기상세대기분석분석분석분석분석분석분석분석 -------- 2020202020202020분분분분분분분분간간간간간간간간

대기대기유형유형 평균평균대기시간대기시간((msms)) 요청요청횟수횟수

CXPACKETCXPACKET 3,1543,154 702702

쿼리프로세서쿼리프로세서 ExchangeExchange연산자연산자동기화동기화시시발생발생. .

이이대기대기유형에유형에대한대한경합이경합이문제가문제가되면되면,,

병렬병렬처리처리수준을수준을낮출낮출것을것을고려할고려할수수있다있다....by by 온라인온라인설명서설명서

??

No 시각 SPIDSPIDSPIDSPIDSPIDSPIDSPIDSPID 대기시간(ms) 대기유형 대기리소스

1 2010-04-05…… 309309 5,5635,563 CXPACKETCXPACKET

2 2010-04-05…… 309309309309309309309309 875875 LATCH_EX PARALLEL…

3 2010-04-05…… 309309 1,3601,360 LATCH_EX PARALLEL…

4 2010-04-05…… 309309 5,0165,016 LATCH_EX PARALLEL…

5 2010-04-05…… 309309 2,0322,032 LATCH_EX PARALLEL…

6 2010-04-05…… 309309 109109 PAGEIOLATCH_SH 15:1:………..

... …… …… ………… …… ……

16 2010-04-05…… 309309 2,0322,032 LATCH_EX PARALLEL…

EXEC EXEC sp_configuresp_configure 'max degree of parallelism''max degree of parallelism', , 44RECONFIGURE RECONFIGURE

SELECT SELECT **FROMFROM Sales.SalesOrderHeaderSales.SalesOrderHeader…………OPTIONOPTION ((MAXDOPMAXDOP 8)8)

CPU nCPU n

Scheduler nScheduler nThread nThread n

3333

6565

3333

3333

평균평균workerworker수수

9797

3333

3333

6565

Clustered Index ScanClustered Index Scan

실제실제행행수수 1904819048

SortSort

실제실제행행수수 83578357

스레드스레드 00 00

스레드스레드 11 10381038

스레드스레드 1010 11441144

…… ……

스레드스레드 3232 378378

…… ……

스레드스레드 99 506506

스레드스레드 00 00

스레드스레드 11 270270

스레드스레드 1010 270270

…… ……

스레드스레드 3232 270270

…… ……

스레드스레드 99 270270

NUMA / 2 Nodes / 8 x 4 Core

“Ordinarily a well tuned OLTP application would not parallelize unless an index is missing, there is an incomplete WHERE clause, or the query is not a true OLTP transaction.”or the query is not a true OLTP transaction.”from SQL Customer Advisory Team

해결해결(solving)(solving)

1) 1) 기본적으로기본적으로쿼리쿼리튜닝튜닝

�� 불필요한불필요한병렬병렬처리처리제거제거

�� 효율적인효율적인병렬병렬처리처리지원지원

2) 2) CXPACKET CXPACKET 대기가대기가문제인문제인경우경우

�� MAXDOPMAXDOP이이너무너무많다면많다면옵션옵션조정조정고려고려

�� 필요필요시시개별개별쿼리쿼리별별 MAXDOP MAXDOP 힌트힌트적용적용

50505050

총총 worker Thread worker Thread 수수

기본은기본은디폴트디폴트설정설정사용사용

필요필요시시 MAXDOP MAXDOP 조정조정고려고려

운영운영시스템에시스템에대한대한충분한충분한이해가이해가선결선결

철저한철저한검증과검증과관리가관리가중요중요

OLAP성쿼리에서 Sort 연산주의

OLTP성쿼리에서 Parallel 연산주의

감사합니다감사합니다. .