๋๋์ด ๋ ๋ฒ์งธ ์์ (์ฌ์ค์ ์ฒซ ๋ฒ์งธ ์์ ์ด๋ค. ์ ๋ฒ ์์์ prerequisite์ด์์ด์..)์ ์์ํ๋ค. ์ด๋ฒ ์์ ์ Indexing for WHERE์ผ๋ก ์ํฉ์ ๋ง๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ ์์ ์ธ ๊ฒ ๊ฐ๋ค.
์ ์ผ ๋จผ์ ํ ์ผ์ StackOverflow ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ฑ์ค๋ฅผ ๋ชจ๋ drop ํ๋ ๊ฒ์ด๋ค.
โ ์ฒซ ๋ฒ์งธ ๋ฌธ์
์๋ ์ฟผ๋ฆฌ๋ฅผ supportํ๋ ์๋ง์ ์ธ๋ฑ์ค ๊ตฌ์ฑํ๊ธฐ.
๋จผ์ ์ด ์ฟผ๋ฆฌ๊ฐ ์ผ๋งํผ์ logical reads๋ฅผ ํ๋์ง๋ถํฐ ํ์ธํด๋ณด์.
์ด ์ฟผ๋ฆฌ๋ 7,778 ํ์ด์ง์ logical reads๋ฅผ ํ๋ค. ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ด๋ป๊ฒ ์ธ์ธ์ง๋ฅผ ๋ด์ผํ๋๋ฐ, ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋๊น WebsiteUrl๊ณผ Location์ผ๋ก ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๊ตฌ์ฑํ๊ณ DisplayName๊ณผ Id๋ฅผ INCLUDEํ๋ฉด ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ ๋ค. ๋ฌธ์ ๋ WebsiteUrl๊ณผ Location ์ค ์ด๋ค ์ปฌ๋ผ์ ์ ํ ์ปฌ๋ผ์ผ๋ก ํ ๊ฒ์ธ์ง์ด๋ค.
์ด๋ ๊ฒ ๊ฑด์๋ฅผ ๋น๊ตํด๋ณด๋ WebsiteUrl์ด Location ๋ณด๋ค ๋ selectiveํด ๋ณด์ธ๋ค. ๊ทธ๋ฌ๋ฉด WebsiteUrl์ ์ ํ์ปฌ๋ผ์ผ๋ก ๋๋ฉด ๋๋? ์ฌ์ค ์ด๋ค ์์๋ก ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ logical reads ๊ด์ ์์๋ ์ฐจ์ด๊ฐ ์๋ค. ํ์ธํด๋ณด์.
- INCLUDE(DisplayName) : Id๋ PK๋๊น INCLUDE์ ๊ตณ์ด ํฌํจ์ํค์ง ์์๋ค.
- WITH(MAXDOP = 0) : MAXDOP ์ ํ๋ ์ด์์ ํ๋ก์ธ์ ๋๋ CPU๊ฐ ์๋ ์ปดํจํฐ์์ ๊ฐ ์ฟผ๋ฆฌ์ ๋ํ ๋จ์ผ ๋ฌธ์ ์คํํ๋๋ฐ ๋ณ๋ ฌ ์คํ ๊ณํ์ ์ฌ์ฉํ ์ ์๋ ํ๋ก์ธ์ ์ ์ด๋ค. (์ถ์ฒ: https://sungwookkang.com/387) MAXDOP์ 0์ผ๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ํ๋ก์ธ์๋ฅผ ๋ค ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค. ์ฟผ๋ฆฌ ์์ค์์์ MAXDOP ํํธ๋ ์๋ฒ ์์ฒด์ max degree of parallelism์ ์ฐ์ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ํ๋ ์ฟผ๋ฆฌ(์ง๊ธ ๋น์ฅ ๋นจ๋ฆฌ ์ฒ๋ฆฌ๋์ด์ผ ํ๋?)์ ์ด ํํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฉํ ๋๊ฐ ๋ง๋ค.
๊ทธ๋ฌ๋ฉด ๋ง๋ ์ธ๋ฑ์ค๋ค์ ์ฌ์ฉํ์ ๋์ ์ฑ๋ฅ์ ํ์ธํด๋ณด์.
๋ ๋ค logical reads๊ฐ 7,778์์ 3์ผ๋ก ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์คํ๊ณํ๋ ํ์ธํด๋ณด์.
๋ ์ธ๋ฑ์ค ๋ชจ๋ ๋์ผํ ์ฑ๋ฅ๊ณผ ์คํ๊ณํ์ ๊ฐ์ง์ ํ์ธํ ์ ์๋ค.
โ ๋ ๋ฒ์งธ ๋ฌธ์
์๋ ์ฟผ๋ฆฌ๋ฅผ supportํ๋ ์๋ง์ ์ธ๋ฑ์ค ๊ตฌ์ฑํ๊ธฐ.
๋จผ์ AS_IS์ logical reads ํ์ธ
๊ฐ ์กฐ๊ฑด์ ๊ฑด์ ๋น๊ตํด๋ณด๊ธฐ (๊ฐ ์ปฌ๋ผ์ selectivity ํ์ธ)
์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์์ ๋ DownVotes๋ณด๋ค UpVotes ์ปฌ๋ผ์ด ๋ selective ํด ๋ณด์ธ๋ค. ์์ชฝ ์ปฌ๋ผ ๋ชจ๋ ์ ํ๋๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ๋ง๋ค์ด์ ๋น๊ตํด๋ณด์.
๊ฐ ์ธ๋ฑ์ค์ ์คํ๊ณํ์ ๋น๊ตํด๋ณด์.
๋ ๋ค index seek๋ฅผ ์ํํ๋ค. (์ด๋์๋ถํฐ ์์ํด์ผํ ์ง ์๊ณ ์๋ค๋ ๋ป) ์คํ๊ณํ์ ์กฐ๊ธ ๋ ์์ธํ ๋ค์ฌ๋ค๋ณด์.
1) ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ
์คํ๊ณํ์ ๋ณด๋ฉด Number of Rows Read์ Actual Number of Rows๊ฐ ๋์ผํ๋ค. → fantastic
๋ ๊ฐ์ ๊ฐ์ด ๋์ผํ๋ค๋ ๊ฒ์ ๋ฑ ํ์ํ ๋งํผ ์ฝ์๋ค๋ ๋ป์ด๊ธฐ์ ๋ถํ์ํ read๊ฐ ์์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
2) ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ
Number of Rows Read๊ฐ Actual Number of Rows๋ณด๋ค ํฌ๋ค. ํ์ํ ์๋ณด๋ค ๋ ๋ง์ด ์ฝ์๋ค๋ ๊ฒ์ ๋ปํ๋ค.
์ ๋ selective ํ ์ปฌ๋ผ์ ์ ํ ์ปฌ๋ผ์ผ๋ก ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ ๋ ๋ ๋ง์ด ์ฝ์์๊น?
๊ฐ ์ธ๋ฑ์ค์ ๋ด๋ถ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ ๋ฒ ํ์ธํด๋ณด์.
1) ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค
DownVotes_UpVotes ์ธ๋ฑ์ค๊ฐ DownVotes = 0 AND UpVotes > 100 ์ธ ์กฐ๊ฑด์ ์ํํ ๋ ์ด๋ค ์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋์ง ๋ณผ ๊ฒ์ด๋ค. ๋จผ์ DownVotes = 0 ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
DownVotes = 0 ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ UpVotes๋ ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋ ์ํ์ด๋ค.
์ด๋ ๊ฒ DownVotes = 0 ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋๊ณ , ๊ทธ ๋ค์์ UpVotes > 100 ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ ํ๋ฉด,
์ด๋ฏธ UpVotes๋ ์ ๋ ฌ์ด ๋์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก ์ฐพ์ ์ ์๋ค. UpVotes๊ฐ 101์ธ ์ง์ ์ ์๊ณ ์ด ์ง์ ๋ถํฐ ์์ํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๊ณ ์๋ค. ์ด๋์๋ถํฐ ์ด๋๊น์ง ์ฝ์ด์ผํ ์ง ์ ํํ ์๊ณ ์์ผ๋ฏ๋ก ์ฝ์ row์ ๊ฒฐ๊ณผ row ์๊ฐ ๋์ผํ ์ ์๋ค. → ์ ์ ํ ์ธ๋ฑ์ค
์ค์ ๋ก ์ธ๋ฑ์ค ํํธ๋ฅผ ์ฃผ์ง ์์์ ๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
2) ๋ ๋ฒ์งธ ์ธ๋ฑ์ค
๋ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๊ณผ์ ๋ visualization ํด๋ณด์.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ์ ์ฒซ ๋ถ๋ถ์ ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ UpVotes > 100 ์ด์์ธ ๋ฐ์ดํฐ๊ฐ ๋์จ๋ค. ๊ทธ ๋ค์ DownVotes๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค. ๊ทธ๋ ์ง๋ง ์กฐ๊ธ ๋ ๋ด๋ ค๋ณด๋ฉด UpVotes๋ ์กฐ๊ฑด์ ๋ง๋๋ฐ DownVotes๊ฐ ์กฐ๊ฑด์ ๋ง์ง ์๋(0์ด ์๋) ๋ฐ์ดํฐ๋ค์ด ๋ฑ์ฅํ๋ค.
UpVotes, DownVotes ์์ผ๋ก ์ ๋ ฌ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ UpVotes ๋ถํฐ ์์๋๋ก ์ฝ๋ค๋ณด๋ฉด DownVotes๊ฐ 0์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๊ฐ์ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ ์ด๋ ๊ฒ ์๊ฐํ ์ ์๋ค. UpVotes๊ฐ 100๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ค ์ค์์ DownVotes๊ฐ 0์ธ ์ ๋ค ์ญ ์ฝ๋ค๊ฐ DownVotes๊ฐ 1์ธ ์ ๋ค์ ๋ง๋๊ฒ ๋๋ฉด ๋๋จธ์ง๋ฅผ ์ ์ฝ๊ณ ๋ค์ UpVotes(UpVotes=102)๋ก ๋์ด๊ฐ๋ฉด ๋์ง ์์๊น?
→ SQL Server๋ ์ด๋ฐ ๊ฑฐ ๋ชปํ๋ค.
SQL Server๋ ์ฌ๊ธฐ์๋ถํฐ ์ฝ์๋, ๋ผ๊ณ ์ ํ๋ฉด ๊ฑฐ๊ธฐ์๋ถํฐ ์ญ ์ฝ์ด์ผ ํ๋ค.
๋ญ ์ด์ฉ ์ ์๋ค. ๋ ๋ง์ด ๋ฒ์ด์ ์ค๋ผํด(์ธ๊ณ ์ต๊ณ ๋น์ผ DB) ์ฐ๋ฉด ๋๋ค. (์ค๋ผํด์ skip scan์ด๋ผ๋ ๊ฒ์ด ์๋ค.)
์๋ฌดํผ ๋ณธ๋ก ์ผ๋ก ๋์์์, SQL Server๋ ๊ทธ๋ ๊ฒ ํ์ํ ๊ฒ๋ง ๊ฑด๋๋ฐ๊ธฐ ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๊ฒฝ์ฐ inequality ์กฐ๊ฑด์ ์ฌ์ฉํ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค์ ์ ํ ์ปฌ๋ผ์ผ๋ก ๋๋ ๊ฒ์ ์ข์ง ๋ชปํ๋ค.
๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ์ฌ์ฉํ์ ๋์ logical reads๋ฅผ ํ์ธํ ์ ์๋ค.
โ ์ธ ๋ฒ์งธ ๋ฌธ์
AS-IS์ logical reads ํ์ ํ๊ธฐ.
WHERE์ ์กฐ๊ฑด : Location LIKE ๊ฒ์, Reputation inequality ์กฐ๊ฑด
๊ฐ ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฑด์ ํ์ ํ๊ธฐ.
Reputation์ด ๋ selectiveํด ๋ณด์ธ๋ค. → ๋์ ๊ฒ์ ์์ญ์ ์ขํ์ฃผ๋ ๋ฐ ์์ด์ Reputation์ด ์ข ๋ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ฉด ์ธ๋ฑ์ค ์ ํ ์ปฌ๋ผ์ Reputation์ ๋ฃ๊ธด ํ ๊ฑด๋ฐ, Location๋ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๋ค์ด๊ฐ์ผ ํ ๊น? INCLUDE๋ก๋ง ํฌํจ์ํค๋ ๊ฒ ๋ซ์ง ์๊ฒ ๋?
ํ์ธํด๋ณด์.
์ด์ ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ ๋์ ์คํ๊ณํ์ ๋น๊ตํด๋ณด์.
์ ๋ ์คํ๊ณํ์ ๋ณด๋ฉด number of rows read์ actual number of rows๊ฐ ๋์ผํ๊ฒ ์ฐจ์ด๊ฐ ๋๋ค.
๋ ๊ฐ์ด ์ฐจ์ด๊ฐ ๋๋ ๊ฑด ์ด์ฉ ์ ์๋ค. Location LIKE '%Germany%' ์ด ์กฐ๊ฑด์ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ ํ ์ง์ ์ผ๋ก seekํ ์ ์๋ค. ๋ค ๊น ๋ด์ผ ํ๋ค.
๊ฒฐ๋ก ์, ์ด๋ฐ ๊ฒฝ์ฐ Location์ด ์ธ๋ฑ์ค ํค๋ก ๋ค์ด๊ฐ๋ INCLUDE๋ก ๋ค์ด๊ฐ๋ ์ฑ๋ฅ ์ ์ฐจ์ด๋ ์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๋ ์ธ๋ฑ์ค ๊ฐ์ ์ฐจ์ด๋ ์๋ค. sp_BlitzIndex๋ฅผ ์คํํด๋ณด์.
๋ฐ์๋์ ์ค ์์๋๋ฐ ์ ๋ฐ์๋ ๋ณด๋ค.
์ด sql ํคํธ๋ brent ozar ์ฌ์ดํธ์์ ์ ์ฒญํ๋ฉด ๋ฌด๋ฃ๋ก ๋ฐ์ ์ ์๋ค. (๋ฉ์ผ๋ก ์ด์ค๋ค.) ์๋ค๋ค์ ์ค์นํ ํ ๋ค์ ์ด์ด์ ์จ์ผ์ง.
'Database > Brent Ozar Unlimited' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
#4. ์ฒซ ๋ฒ์งธ ์์ - How to Think Like the Engine 2 (0) | 2021.07.08 |
---|---|
#3. ์ฒซ ๋ฒ์งธ ์์ - How to Think Like the Engine (0) | 2021.06.24 |
#2. ์ฒซ ๋ฒ์งธ ์์ - ์ฌ์ ์์ (0) | 2021.06.24 |
#1. Brent Ozar ์์ (0) | 2021.06.14 |