๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Database/Brent Ozar Unlimited

#3. ์ฒซ ๋ฒˆ์งธ ์ˆ˜์—… - How to Think Like the Engine

<How to Think Like the Engine>

(* ์ง์ ‘ ์ฝ๊ณ  ๋“ฃ๊ณ  ํ•ด์„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ๋งŽ์„ ์ˆ˜ ์žˆ์Œ ์ฃผ์˜)

 

์˜์ƒ์—์„œ ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”์€ StackOverflow2010.dbo.Users ํ…Œ์ด๋ธ”์ด๋‹ค.

 

 

PK๋Š” Id์ด๋‹ค. clustered index๊ฐ€ Id๋กœ ์žกํ˜€์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์‚ฌ์‹ค์ƒ clustered index = ํ…Œ์ด๋ธ” ์ž์ฒด ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

๋ธŒ๋ ŒํŠธ ์•„์ €์”จ๊ป˜์„œ ์˜ฌ๋ ค์ฃผ์‹  pdf ์˜ ์ฒซ ์žฅ์„ ๋ณด๋ฉด clustered index์˜ ๋ฐ์ดํ„ฐ๊ฐ€ Id๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ํŒŒ์ผ์„ ๋ดค์„ ๋•Œ clustered index๋Š” Id๋กœ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๊ณ  ๊ทธ ์™ธ์˜ ์ปฌ๋Ÿผ๋“ค์˜ ๊ฐ’๋„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

→ ์ •ํ™•ํ•˜๊ฒŒ ๋”ฐ์ง€์ž๋ฉด ์ด ํ‘œํ˜„์€ ๋งž์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•ด๋‘์‹ ๋‹ค๊ณ  ํ•œ๋‹ค. AboutMe ์ปฌ๋Ÿผ์ด ์ข‹์€ ์˜ˆ๋‹ค. ์ด ์ปฌ๋Ÿผ์„ ๋ณด๋ฉด ์ผ๋‹จ ๋‚ด์šฉ์ด ๊ธธ๋‹ค. 8KB (ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ) ๋ณด๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์–ด ๋ณด์ธ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ SQL Server๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. varchar(max), nvarchar(max), xml, json ๊ฐ™์€ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ ์š”๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

SQL Server๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„๋กœ 8KB ์งœ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ํŽ˜์ด์ง€๋ผ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋“  ๋””์Šคํฌ์— ์žˆ๋“  ๋™์ผํ•˜๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด, Users ํ…Œ์ด๋ธ”์—์„œ ๋ˆ„๊ตฐ๊ฐ€์˜ LastAccessDate๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•  ๋•Œ, ๋‚˜๋Š” ๊ทธ ์‚ฌ๋žŒ์˜ LastAccessDate๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†“๊ณ , ์ˆ˜์ •์„ ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋””์Šคํฌ์— ๊ฐ–๋‹ค๋†”์•ผ ํ•œ๋‹ค. SQL Server๋Š” row ๋‹จ์œ„๋‚˜ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์บ์‹ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. (ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ๋งŒ ํ•จ) 

 

์ด์ œ ์•ž์œผ๋กœ ํ•ด์•ผํ•  ๊ฒƒ์€ ๋‚ด๊ฐ€ SQL Server๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋ฅผ ๋กค ํ”Œ๋ ˆ์ž‰ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. (๋ถ€๋‹ด;)

 

โ–  ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ:

 

SELECT Id FROM dbo.Users;

 

์ผ๋‹จ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด๋ณด์ž. ๋‚˜๋Š” ์ธ์‚ฌํŒ€ ์†Œ์†์ด๊ณ  ์ง์›๋“ค์˜ ์ธ์‚ฌ๊ธฐ๋ก์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด ์ธ์‚ฌ๊ธฐ๋ก ์ •๋ณด๋Š” ์ข…์ด๋กœ ํ”„๋ฆฐํŠธ๋˜์–ด ์ฐฝ๊ณ  ์บ๋น„๋„ท์— ๋ฐ•ํ˜€์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์›์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ๋งŽ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์‚ฌํŒ€ ํŒ€์žฅ๋‹˜๊ป˜์„œ ์ด ์ธ์‚ฌ๊ธฐ๋ก์„ ๋ณด๊ณ  ์‹ถ์œผ์‹ค ๋•Œ๋งˆ๋‹ค ๋‚˜ํ•œํ…Œ ์ธ์‚ฌ๊ธฐ๋ก์ง€๋ฅผ ๊ฐ–๊ณ ์˜ค๋ผ๊ณ  ์‹œํ‚จ๋‹ค. ๋‚˜์˜ ์ผ์€ ์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ๋งŽ์€ ์‚ฌ์›์˜ ์ธ์‚ฌ๊ธฐ๋ก์ง€ ์ค‘์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋นจ๋ฆฌ ์ฐพ์•„์„œ ํŒ€์žฅ๋‹˜๊ป˜ ๊ฐ–๋‹ค๋“œ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

 

์œ„์˜ ์ฟผ๋ฆฌ๋Œ€๋กœ๋ผ๋ฉด ํŒ€์žฅ๋‹˜๊ป˜์„œ๋Š” ์ „ ์‚ฌ์›์˜ Id๋ฅผ ์•Œ๊ณ  ์‹ถ์œผ์‹  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿผ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ์ฐฝ๊ณ ์— ์žˆ๋Š” ์บ๋น„๋„ท์œผ๋กœ ๊ฐ€์„œ ํ•œ ๋ช… ํ•œ ๋ช…์”ฉ ์žกํžˆ๋Š” ๋Œ€๋กœ Id๋ฅผ ์ฐพ์•„์„œ ํŒ€์žฅ๋‹˜ ๋“ค๋ฆฌ๋„๋ก ์™ธ์นœ๋‹ค. (์ง„์งœ ์‚ฌ๋ฌด์‹ค์—์„œ๋Š” ๊ทธ๋Ÿฌ์ง€ ๋ง๋„๋ก ํ•˜์ž.) 

 

 

์–˜๋„ ๋Œ€์ถฉ ๋น„์Šทํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿผ ๋‚˜๋Š” ์ด์ œ ์บ๋น„๋„ท์—์„œ ๋‚ด๊ฐ€ ๋ˆˆ์œผ๋กœ ์ฝ์–ด์•ผ ํ•˜๋Š” ์ข…์ด๊ฐ€ ๋Œ€์ฒด ๋ช‡ ์žฅ์ธ์ง€๋„ ์•Œ๊ณ  ์‹ถ๋‹ค. → SET STATISTICS IO ON 

 

 

์—ฌ๊ธฐ์„œ '๋…ผ๋ฆฌ์  ์ฝ๊ธฐ ์ˆ˜(Logical reads)'๋ž€ SQL Server๊ฐ€ ์ฝ์€ 8KB ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜์ด๋‹ค.

→ 7,405 * 8KB = 59MB 

 

 

โ–  ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ:

SELECT Id FROM dbo.Users
WHERE LastAccessDate > '2014/07/01';

ํŒ€์žฅ๋‹˜์€ ์ด๋ฒˆ์—๋Š” LastAccessDate๊ฐ€ 2014๋…„ 7์›” 1์ผ ์ดํ›„์ธ ์‚ฌ์›๋“ค์˜ Id๋ฅผ ๋ชจ์กฐ๋ฆฌ ๋ณด๊ณ  ์‹ถ์œผ์‹œ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์บ๋น„๋„ท์— ๊ฐ€์„œ ์ธ์‚ฌ๊ธฐ๋ก์ง€๋ฅผ ํ•œ ์žฅ์”ฉ(=ํ•œ ํŽ˜์ด์ง€์”ฉ) ๊บผ๋‚ด์„œ ๋ชจ๋“ ์˜ LastAccessDate๋ฅผ ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  LastAccessDate๊ฐ€ ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์›์˜ Id๋ฅผ ์™ธ์น  ๊ฒƒ์ด๋‹ค.

 

 

์•„, ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์˜์ƒ์—๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์—†๋Š” ์‹คํ–‰๊ณ„ํš์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ ์ผ๋‹จ ๋˜‘๊ฐ™์ด ๋งž์ถฐ๋ณธ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์™€ I/O๋ฅผ ๋น„๊ตํ•ด๋ณด์ž.

 

 

๊ฒฐ๊ณผ ๊ฑด์ˆ˜๋Š” ๊ฑฐ์˜ ๋ฐ˜์œผ๋กœ ์ค„์—ˆ์ง€๋งŒ logical reads ์ˆ˜๋Š” ๋™์ผํ•˜๋‹ค. ์™œ๋ƒ๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋„ ์ „์ฒด ์ธ์‚ฌ๊ธฐ๋ก์ง€๋ฅผ ๋’ค์กŒ์„ ๊ฒƒ์ด๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋„ ๋ชจ๋“  ์‚ฌ์›์˜ LastAccessDate๊ฐ€ ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด ์ „ ์‚ฌ์›์˜ ์ธ์‚ฌ๊ธฐ๋ก์ง€๋ฅผ ๋’ค์กŒ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Lesson : Using WHERE without matching index means scanning all the data.

์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์—†์ด WHERE ์ ˆ์„ ์“ฐ๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๊ด€๋ จํ•ด์„œ ์ž ์‹œ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ ์ƒ๊ธฐ๋Š” ์ถ”๊ฐ€ read๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์— ์งฌ ์•ˆ ๋˜๋Š” ์• ๊ฐ€ ๋‚˜๋ฐ–์— ์—†์–ด์„œ ๋‚˜๋งŒ ์ฐพ์œผ๋Ÿฌ ๊ฐ”๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ(Parallelism)๋กœ ์‹คํ–‰๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹ ์ž…๊ณต์ฑ„๋กœ ์ธ์‚ฌํŒ€ ์‹ ์ž…์„ ๋ช‡ ๋ช… ๋ฝ‘์•˜๊ณ  ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„๋ณด์ด๋‹ˆ๊นŒ ์‚ฌ๋žŒ์„ ์—ฌ๋Ÿฌ ๋ช… ํˆฌ์ž…์‹œ์ผฐ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋ณ‘๋ ฌ๋กœ ๋Œ์•˜์„ ๊ฒฝ์šฐ (MAXDOP 1 OPTION์„ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ) logical reads๊ฐ€ ๋” ๋Š˜์–ด๋‚œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์ˆ˜์—…์‹œ๊ฐ„ ๋•Œ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์˜ˆ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

์‹คํ–‰ ๊ณ„ํš์„ ํ•œ ๋ฒˆ ๋น„๊ตํ•ด ๋ณด์ž.

 

SELECT ๋ถ€๋ถ„์˜ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๋ณด๋ฉด Estimated Subtree Cost๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. 

 

 

๋‘ ์ฟผ๋ฆฌ์˜ Estimated Subtree Cost๋ฅผ ๋น„๊ตํ•ด๋ณด๋‹ˆ, ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ Estimated Subtree Cost๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ Estimated Subtree Cost๋ณด๋‹ค ์‚ด์ง ๋‚ฎ๋‹ค. ์ด๋Ÿฌ๋ฉด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ์ชฝ์ด ๋น„์šฉ(cost)์ด ์ ๊ฒŒ ๋“  ๊ฑธ๊นŒ? ํ•œ ๋ช…์ด ํ•  ์ผ์„ ์—ฌ๋Ÿฌ ๋ช…์ด ๋‚˜๋ˆ ์„œ ํ•˜๋‹ˆ๊นŒ?

→ No

 

์ด Estimated Subtree Cost๋ผ๋Š” ๊ฒŒ ๋ญ๋ƒ๋ฉด SQL Server๊ฐ€ ์ฟผ๋ฆฌ ๋Œ๋ ค๋ณด๊ธฐ ์ „์— ๋Œ€์ถฉ CPU๋ž‘ I/O๊ฐ€ ์–ผ๋งŒํผ ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์˜ˆ์ƒํ•˜๋Š” ์ˆ˜์น˜ ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค SQL Server๋Š” ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ฝ”์–ด๋‚˜ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ์ง€๋„ ๋ชจ๋ฅด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ •๋„๋งŒ ๋Œ€๊ฐ• ์•Œ๊ณ  ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ๋„ ์ •ํ™•ํžˆ ์•Œ ๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์˜ˆ์ธกํ•œ ๊ฒฐ๊ณผ๋„ ๊ทธ๋ ‡๊ฒŒ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š๋‹ค. ์ด ๊ฐ’์€ ๊ทธ๋ƒฅ how expensive SQL Server "thought" the query was going to be ์˜ ๊ฐ’ ์ •๋„๋กœ๋งŒ ์ฐธ๊ณ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•œ๋‹ค.

 

โ–  ์„ธ ๋ฒˆ์งธ ์ฟผ๋ฆฌ:

SELECT Id FROM dbo.Users
WHERE LastAccessDate > '2014/07/01'
ORDER BY LastAccessDate;

์ด๋ฒˆ์—๋Š” ์•„๊นŒ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ LastAccessDate ์ˆœ์œผ๋กœ ํŒ€์žฅ๋‹˜๊ป˜ ์•Œ๋ ค๋“œ๋ ค์•ผ ํ•œ๋‹ค. ์ด๋ฒˆ์—๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

๋จผ์ € ์บ๋น„๋„ท์œผ๋กœ ๊ฐ€์„œ ํ•œ ์žฅ์”ฉ(=ํ•œ ํŽ˜์ด์ง€์”ฉ) ๊บผ๋‚ด๋ณด๋ฉด์„œ ์กฐ๊ฑด์— ๋งž๋Š” (LastAccessDate > '2014/07/01') ์‚ฌ์›์„ ์ฐพ๊ณ , ์ถ”ํ›„๋ฅผ ์œ„ํ•ด ํฌ์ŠคํŠธ์ž‡์— ์ ์–ด๋†“๋Š”๋‹ค. ๋ญ˜ ์ ์„๊นŒ? Id๋ž‘ LastAccessDate๋ฅผ ์ ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— LastAccessDate๋กœ ์ •๋ ฌํ•œ ๋’ค Id๋ฅผ ์™ธ์น˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

โ‘  Clustered Index Scan

- ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ์˜ Id์™€ LastAccessDate๋ฅผ ๋‹ค์Œ ์—ฐ์‚ฐ์ž์—๊ฒŒ ์™ธ์นœ๋‹ค. (์•Œ๋ ค์ค€๋‹ค.)

โ‘ก Sort

- ์•ž์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์•Œ๋ ค์ค€ Id์™€ LastAccessDate๋ฅผ ๊ฐ€์ง€๊ณ  ์ข…์ด์— ์ ์–ด๊ฐ€์ง€๊ณ  ์ •๋ ฌ์„ ํ•œ๋‹ค.

โ‘ข Parallelism (Gather Streams)

- ์—ฌ๋Ÿฌ ๋ช…์ด ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ •๋ ฌํ•ด๋†“์€ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์นœ๋‹ค.

 

์ •๋ ฌ์ด ์žˆ์„ ๋•Œ์™€ ์—†์„ ๋•Œ์˜ ์‹คํ–‰๊ณ„ํš์„ ๋น„๊ตํ•ด๋ณด์ž.

 

 

์ •๋ ฌ์„ ํ•œ ์ชฝ์˜ Estimated Subtree Cost ๊ฐ’์ด ๋” ํฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ‘์˜ Memory Grant๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ •๋ ฌ์ด ์žˆ๋Š” ์ชฝ์˜ ๊ฐ’์ด ํ›จ์”ฌ ๋” ํฐ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์˜ ์˜๋ฏธ๋Š”, We need space in order to write down our query results, ์ด๋‹ค.

 

SQL Server๊ฐ€ ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 3 ๊ฐ€์ง€ ํฐ ์›์ธ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- Caching data pages : tries to cache pages in memory as long as it can, because storage can be super slow

- Query workspace : all these little post-it notes, which are coincidentally the same 8KB page size as regular data pages

- Execution plans : when SQL Server has to build one of these big complex maps of how it's gonna process your query, it caches this for a while so that it doesn't have to rebuild that same execution plan again whenever that query plan comes back

 

Memory Grant์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์ข€ ๋” ์‚ดํŽด๋ณด์ž.

  • DesiredMemory : how much SQL Server would love to have 
  • RequestedMemory : how much it actually asked for
  • MaxUsedMamory : how much SQL Server actually consumed while it was running that query

 

To be continued...