๐Ÿ”ฅ 1. ์ธ๋ฑ์Šค(Index)๋ž€?

๐Ÿ“Œ ์ธ๋ฑ์Šค(Index)๋ž€?

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ผ์ƒ์ƒํ™œ์˜ ์ธ๋ฑ์Šค์™€ ๋™์ผํ•œ ๊ฐœ๋…
    • Clustered Index (ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค) โ†’ ์˜ํ•œ ์‚ฌ์ „
    • Non-Clustered Index (๋…ผํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค) โ†’ ์ฑ…์˜ ์ƒ‰์ธ(Index)
  • ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ Clustered Index vs Non-Clustered Index ์ฐจ์ด์ 

๊ตฌ๋ถ„Clustered Index (ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค)Non-Clustered Index (๋…ผํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค)
๊ฐœ๋…์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค ์ž์ฒด์— ์ €์žฅ์ธ๋ฑ์Šค์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ
๋ฐ์ดํ„ฐ ์ •๋ ฌ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ํ‚ค ๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌ๋จ๋ฐ์ดํ„ฐ๋Š” ์ •๋ ฌ๋˜์ง€ ์•Š๊ณ , ์ธ๋ฑ์Šค๋งŒ ๋ณ„๋„๋กœ ๊ด€๋ฆฌ
์ €์žฅ ๊ตฌ์กฐLeaf Page = Data Page (์‹ค์ œ ๋ฐ์ดํ„ฐ ํฌํ•จ)Leaf Page = Index Page (๋ฐ์ดํ„ฐ ์ฃผ์†Œ ํฌํ•จ)
๊ฐœ์ˆ˜ํ…Œ์ด๋ธ”๋‹น 1๊ฐœ๋งŒ ๊ฐ€๋Šฅํ…Œ์ด๋ธ”๋‹น ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ
๊ฒ€์ƒ‰ ์†๋„๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์„œ ๊ฒ€์ƒ‰์ด ๋น ๋ฆ„์ถ”๊ฐ€์ ์ธ Lookup์ด ํ•„์š”ํ•˜์—ฌ ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
์‚ฌ์šฉ ์˜ˆPRIMARY KEYWHERE ์กฐ๊ฑด์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ

๐Ÿ”ฅ 2. Clustered vs Non-Clustered ์ธ๋ฑ์Šค ์‹ค์Šต

๐Ÿ“Œ ์‹ค์Šต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: Northwind

โœ… ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด ํ™•์ธ

-- Northwind ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด ํ™•์ธ
EXEC sp_helpdb 'Northwind';

โœ… ์ฃผ๋ฌธ ์ƒ์„ธ ์ •๋ณด ํ…Œ์ด๋ธ”(Order Details) ์กฐํšŒ

-- ์ฃผ๋ฌธ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
SELECT *
FROM [Order Details]
ORDER BY OrderID;

โœ… ํ…Œ์ŠคํŠธ์šฉ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ

-- ์ž„์‹œ ํ…Œ์ŠคํŠธ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
SELECT *
INTO TestOrderDetails
FROM [Order Details];

-- ๋ฐ์ดํ„ฐ ํ™•์ธ
SELECT * FROM TestOrderDetails;

๐Ÿ”ฅ 3. Non-Clustered Index (๋…ผํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค) ์‹ค์Šต

๐Ÿ“Œ Non-Clustered Index ์ƒ์„ฑ

-- Non-Clustered ์ธ๋ฑ์Šค ์ถ”๊ฐ€
CREATE INDEX Index_OrderDetails
ON TestOrderDetails(OrderID, ProductID);

โœ… ์ธ๋ฑ์Šค ์ •๋ณด ํ™•์ธ

EXEC sp_helpindex 'TestOrderDetails';

โœ… ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ ์ฐพ๊ธฐ

SELECT index_id, name
FROM sys.indexes
WHERE object_id = object_id('TestOrderDetails');

๐Ÿ”น ์ถœ๋ ฅ ์˜ˆ์‹œ
| index_id | name |
|----------|----------------------|
| 2 | Index_OrderDetails |

๐Ÿ“Œ ์ธ๋ฑ์Šค ์ •๋ณด ์กฐํšŒ

DBCC IND('Northwind', 'TestOrderDetails', 2);

๐Ÿ“Œ Non-Clustered Index์˜ B-Tree ๊ตฌ์กฐ ์˜ˆ์‹œ

          [ Root: 904 ]
       /           \
  [832]          [872] [873] [874] [875] [876]

โœ… ํŠน์ • ํŽ˜์ด์ง€ ์ƒ์„ธ ์กฐํšŒ

DBCC PAGE('Northwind', 1, 832, 3);

๐Ÿ“Œ Heap Table๊ณผ Non-Clustered Index

  • Non-Clustered Index๋Š” Heap Table๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํฌํ•จํ•˜์ง€ ์•Š์Œ
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด Heap Table์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ํ•„์š” (Bookmark Lookup ๋ฐœ์ƒ)

๐Ÿ”ฅ 4. Clustered Index (ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค) ์‹ค์Šต

๐Ÿ“Œ Clustered Index ์ƒ์„ฑ

-- Clustered Index ์ถ”๊ฐ€
CREATE CLUSTERED INDEX Index_OrderDetails_Clustered
ON TestOrderDetails(OrderID);

โœ… Clustered Index ์ƒ์„ฑ ํ›„ ์ธ๋ฑ์Šค ์ •๋ณด ํ™•์ธ

DBCC IND('Northwind', 'TestOrderDetails', 1);

๐Ÿ“Œ Clustered Index์˜ B-Tree ๊ตฌ์กฐ ์˜ˆ์‹œ

          [ Root: 928 ]
       /           \
  [880]          [888] [889] [890] [891] ... [896]

โœ… ํŠน์ • ํŽ˜์ด์ง€ ์ƒ์„ธ ์กฐํšŒ

DBCC PAGE('Northwind', 1, 880, 3);

๐Ÿ“Œ Clustered Index์˜ ํŠน์ง•

  • Heap Table์ด ์‚ฌ๋ผ์ง€๊ณ  ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ Leaf Page์— ์ €์žฅ๋จ
  • ๋”ฐ๋ผ์„œ Bookmark Lookup ์—†์ด ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ฐ€๋Šฅ (๋น ๋ฆ„)

๐Ÿ”ฅ 5. Clustered vs Non-Clustered ์ธ๋ฑ์Šค ์ฐจ์ด์ 

โœ… Heap Table ๊ธฐ๋ฐ˜ Non-Clustered Index ๊ตฌ์กฐ

[ Non-Clustered Index ]
        |
[ Heap Table ] โ† ๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜ (RID ์‚ฌ์šฉ)

โœ… Clustered Index ๊ธฐ๋ฐ˜ Non-Clustered Index ๊ตฌ์กฐ

[ Non-Clustered Index ]
        |
[ Clustered Index ] โ† ๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜ (Key ์‚ฌ์šฉ)

๐Ÿ“Œ Non-Clustered Index๋Š” Clustered Index ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฆ„

  • Clustered Index๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ โ†’ Heap Table ์‚ฌ์šฉ
  • Clustered Index๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ โ†’ Clustered Key ์‚ฌ์šฉ

โœ… Heap Table์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ

-- Heap Table์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ (Non-Clustered Index๋งŒ ์กด์žฌํ•  ๊ฒฝ์šฐ)
DBCC PAGE('Northwind', 1, 832, 3);

โœ… Clustered Index ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ

-- Clustered Index ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ (Non-Clustered + Clustered Index ๋™์ž‘ ๋ฐฉ์‹ ํ™•์ธ)
DBCC PAGE('Northwind', 1, 880, 3);

profile
๏งกๅฎถ๋„ค_๊ณต๋ถ€๋ฐฉ

0๊ฐœ์˜ ๋Œ“๊ธ€