๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/ORACLE

(30)[ORACLE] 13์ผ์ฐจ : ์ธ๋ฑ์Šค(INDEX)

by ๋”ฐ๊ถˆ 2024. 3. 27.

 

 

์ธ๋ฑ์Šค๋ž€?
์ธ๋ฑ์Šค๋Š” ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์“ฐ์—ฌ์ง€๋Š” ์„ ํƒ์ ์ธ ๊ฐ์ฒด๋กœ์„œ, ์˜ค๋ผํด
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋‚ด์˜ ์›ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.
SQL ๋ช…๋ น๋ฌธ์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ ์ƒ์„ฑํ•˜๋Š” ์˜ค๋ผํด ๊ฐ์ฒด
์ธ๋ฑ์Šค๋Š” ๋””์Šคํฌ I/O๋ฅผ ์ค„์ด๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜.
์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ
์˜ตํ‹ฐ๋งˆ์ด์ €๋Š”  SQL์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ตœ์ (์ตœ์ €๋น„์šฉ)์˜ ์ฒ˜๋ฆฌ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š”
DBMS ๋‚ด๋ถ€์˜ ํ•ต์‹ฌ์—”์ง„์ด๋‹ค.

 

 

์ธ๋ฑ์Šค ํŠน์„ฑ

  1. ์ธ๋ฑ์Šค๋Š” ์—ฐ๊ด€๋œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ์™€ ๋…ผ๋ฆฌ์  ๋ฐ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋…๋ฆฝ์ ์ธ ์Šคํ‚ค๋งˆ ๊ฐ์ฒด
  2. ํ…Œ์ด๋ธ”์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  3. ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์กฐ์ธ์ด๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์˜ ๊ฐ™์€ ์œ„์น˜์— ์ €์žฅ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

 

์ธ๋ฑ์Šค ๊ณ ๋ ค์‚ฌํ•ญ 

  • ์ธ๋ฑ์Šค๊ฐ€ ํ•ญ์ƒ ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜์ง„ ์•Š๋Š”๋‹ค.
  • ์กฐ๊ฑด์ ˆ์— ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค์˜ ์‚ฌ์šฉ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.(๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ์ˆœ์„œ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.)
  • INSERT,DELETE,UPDATE๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ผ์–ด๋‚˜๋Š”์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  • ์ธ๋ฑ์Šค๋Š” ํƒ€ SQL ์‹คํ–‰์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์— ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ž˜ ์‹คํ–‰ํ•˜๋˜ SQL์ด ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๋กœ ์ธํ•˜์—ฌ ๋А๋ ค์ง€๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ธ๋ฐ์Šค๋Š” ์ถ”๊ฐ€์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

 

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
WHERE ์ ˆ์ด๋‚˜ JOIN์กฐ๊ฑด์ ˆ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ ํ…Œ์ด๋ธ”์— ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ์ ์€ ๊ฒฝ์šฐ
๊ฐ’์ด ์•„์ฃผ ๋“œ๋ฌผ๊ฒŒ ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ(NULL์„ ํฌํ•จํ•˜๋Š” ์ปฌ๋Ÿผ์ด ๋งŽ์€ ๊ฒฝ์šฐ) WHERE๋ฌธ์— ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„๋•Œ
ํ…Œ์ด๋ธ”์— ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๊ณ , ์งˆ์˜ํ•  ๋•Œ ์ „์ฒด ํ–‰์˜ 2~4% ๊ฒ€์ƒ‰์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์ปฌ๋Ÿผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 10~15% ์ด์ƒ์ผ๋•Œ
์ž์ฃผ ์กฐํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์€ ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๋กœ ์ƒ์„ฑ ํ…Œ์ด๋ธ”์— DML ์ž‘์—…์ด ๋งŽ์€ ๊ฒฝ์šฐ. ์ฆ‰ ์ž…๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์ด ์ž์ฃผ ์ผ์–ด๋‚  ๋•Œ 

 

โ–ถ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์ด ๋น„๊ต๋˜๊ธฐ ์ „์— ๋ณ€ํ˜•์ด ์ผ์–ด๋‚œ ๊ฒฝ์šฐ
  • ๋ถ€์ •ํ˜•(NOT)์œผ๋กœ ์กฐ๊ฑด์„ ๊ธฐ์ˆ ํ•œ ๊ฒฝ์šฐ
  • ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์ด NULL๋กœ ๋น„๊ต๋˜๋Š” ๊ฒฝ์šฐ 

 

์ธ๋ฑ์Šค ์ข…๋ฅ˜

-- B-Tree ์ธ๋ฑ์Šค
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…, ...);

-- ๋‹จ์ผ ์ธ๋ฑ์Šค(Single Index) : ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…);

-- ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค(Composite Index) : ๋‘๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…, ์ปฌ๋Ÿผ๋ช…, ...);

-- ๊ณ ์œ  ์ธ๋ฑ์Šค(Unique INdex) : ์œ ์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋งŒ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •
CREATE UNIQUE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…, ...);

-- Bitmap ์ธ๋ฑ์Šค(Express๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ)
CREATE BITMAP INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…, ...);

-- ํ•จ์ˆ˜๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(ํ•จ์ˆ˜์‹(์ปฌ๋Ÿผ๋ช…) | ์‚ฐ์ˆ ์‹);

-- ์—ญ๋ฐฉํ–ฅ ์ธ๋ฑ์Šค
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…1,์ปฌ๋Ÿผ๋ช…2, ...) REVERSE;

-- ๋‚ด๋ฆผ์ฐจ์ˆœ ์ธ๋ฑ์Šค
CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ๋ช…1,์ปฌ๋Ÿผ๋ช…2, ... DESC);

 

 

B-Tree indexes

  • ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค
  • ๊ธฐ๋ณธ ํ‚ค ๋ฐ ์„ ํƒ์„ฑ์ด ๋†’์€ ์ธ๋ฑ์Šค์— ์ ํ•ฉ
  • ์—ฐ๊ฒฐ๋œ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” B-Tree ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์Šค ๋œ ์ปฌ๋Ÿผ๋ณ„๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
--B-Tree ์ธ๋ฑ์Šค ์ž‘์„ฑ
CREATE INDEX idx_emp_name ON emp(name);
            --NONUINQUE
            
--์ธ๋ฑ์Šค ํ™•์ธ
SELECT * FROM user_indexes WHERE table_name='EMP';
SELECT * FROM user_ind_columns WHERE table_name='EMP';            

--์ธ๋ฑ์Šค ์‚ญ์ œ
DROP INDEX idx_emp_name;

 

 

๊ฒฐํ•ฉ ์ธ๋ฑ์Šค

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
--๊ฒฐํ•ฉ ์ธ๋ฑ์Šค : ๋‘๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค ์ž‘์„ฑ

SELECT empNO,name,sal,dept
FROM emp
WHERE name = '์ด์ƒํ•œ' AND dept = '๊ฐœ๋ฐœ๋ถ€';
--AND ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
--OR ์—ฐ์‚ฐ์€ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค 

--๊ฒฐํ•ฉ ์ธ๋ฑ์Šค ์ž‘์„ฑ
CREATE INDEX idx_emp_comp ON emp(name,dept);

--CREATE INDEX idx_emp_comp ON emp(dept,name);
--๋ถ€์„œ์—์„œ ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ 
--์ด๋ฆ„์—์„œ ๋ถ€์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค. 
--์ฆ‰, ๋ถ€์„œ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํ–‰์ด ์ด๋ฆ„์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋ณด๋‹ค ๋งŽ์œผ๋ฏ€๋กœ

 

 

ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค

  • ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๋Š” ํ‘œํ˜„์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
  • B-Tree์™€ Bitmap ์ธ๋ฑ์Šค๋Š” ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ผ ์ˆ˜ ์žˆ๋‹ค. 
--ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค

SELECT empNO,name,rrn
FROM emp
WHERE MOD(SUBSTR(rrn,8,1),2)=1;

--ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค
CREATE INDEX idx_emp_fin ON emp (MOD(SUBSTR(rrn,8,1),2));

--์ธ๋ฑ์Šค ์‚ญ์ œ 
DROP INDEX idx_emp_fin;

 

 

 

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

--์ธ๋ฑ์Šค ์ƒํƒœ ์กฐํšŒ
ANALYZE INDEX idx_test_num VALIDATE STRUCTURE; --๋ถ„์„
SELECT * FROM index_stats WHERE name = 'IDX_TEST_NUM'; -- ์ƒํƒœ ํ™•์ธ

SELECT (del_lf_rows_len / lf_rows_len)*100
FROM INDEX_stats
WHERE name='IDX_TEST_NUM'; --0์— ๊ฐ€๊นŒ์šฐ๋ฉด ์ข‹์€ ์ƒํƒœ

 

 

INDEX Rebuild

  • ํ…Œ์ด๋ธ”์€ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๊ฐ€ ๋˜์ง€๋งŒ, ์ธ๋ฑ์Šค๋Š” ์ž…๋ ฅ๋งŒ ๋˜๊ณ  ์‚ญ์ œ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ์ง€์›Œ์ ธ์„œ ์ธ๋ฑ์Šค ๋ธ”๋Ÿญ์ด ๋น„๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉ ๊ณต๊ฐ„์„ ์‚ญ์ œํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. 
--์ธ๋ฑ์ŠคREBUILD

ALTER INDEX idx_test_num REBUILD;

ANALYZE INDEX idx_test_num VALIDATE STRUCTURE; --๋ถ„์„

 

 

 ํžŒํŠธ(hint)

-- โ—Ž ํžŒํŠธ(hint)
---------------------------------------------------
--์˜ตํ‹ฐ๋งˆ์ด์ €์—๊ฒŒ SQL๋ฌธ ์‹คํ–‰์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์Šค์บ๋‹ ๊ฒฝ๋กœ, ์กฐ์ธ ๋ฐฉ๋ฒ•๋“ฑ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
--ํ˜•์‹
SELECT /*_hint_name)param)*/์ปฌ๋Ÿผ,์ปฌ๋Ÿผ FROM ํ…Œ์ด๋ธ”๋ช…;


--ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
SELECT * FROM(
    SELECT ROWNUM rnum,empNo,name FROM(
        SELECT empNo,name
        FROM emp
        ORDER BY empNo DESC
        ) WHERE ROWNUM <= 30
    )WHERE rnum >=21;


--ํžŒํŠธ(hint)๋ฅผ ์ด์šฉํ•œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
SELECT rnum, empno, NAME FROM (
    SELECT /*+ INDEX_DESC(emp PK_EMP_EMPNO)*/ ROWNUM rnum, empno, NAME
    FROM emp
    WHERE ROWNUM <= 30
)
WHERE rnum >= 21;

--INDEX+ASC,INDEX+DESC :๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํžŒํŠธ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ˆœ์„œ,์—ญ์ˆœ์œผ๋กœ ์ด์šฉํ• ์ง€ ์ง€์ •