Claire's Study Note

[SQL BOOSTER] 6-1. INDEX์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ“š SQL BOOSTER (์œ ์ผํ™˜, DBian)

 

CH6. INDEX

6-1. INDEX์˜ ๊ฐœ๋ณธ ๊ฐœ๋…

6-1-1. ์ธ๋ฑ์Šค(INDEX)๋ž€?

DB์˜ ์ธ๋ฑ์Šค(INDEX)๋Š” ์ฑ…์˜ ์ƒ‰์ธ(INDEX)์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ๊ตฌ์„ฑํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ1. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ T_ORD_BIG ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

CREATE TABLE T_ORD_BIG AS
SELECT T1.*, T2.RNO, TO_CHAR(T1.ORD_DT, 'yyyymmdd') ORD_YMD
FROM T_ORD T1
    , (SELECT ROWNUM RNO
       FROM DUAL
       CONNECT BY ROWNUM <= 10000) T2;

 

์˜ˆ์‹œ2. T_ORD_BIG ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„ ์ƒ์„ฑํ•˜๊ธฐ(์—๋Ÿฌ)

EXEC DBMS_STATS.GATHER_TABLE_STATS('test_user', 'T_ORD_BIG');

 

์œ„์˜ SQL์„ ์‹คํ–‰ํ•˜์—ฌ T_ORD_BIG ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

ORA-00900 ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ตฌ๊ธ€๋งํ•ด๋ณด์•˜๋‹ค.

EXEC ๋ช…๋ น์–ด๋Š” PL/SQL ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ SQL*Plus ๋ช…๋ น์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— EXEC ๋Œ€์‹  BEGIN ... END; ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ผ๋Š” ๋Œ“๊ธ€์„ ๋ณด๊ฒŒ๋˜์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

(์ถœ์ฒ˜) https://stackoverflow.com/questions/64058383/how-to-resolve-issue-of-stored-proc-not-executing-dbms-stats-gather-table-stats

 

How to resolve issue of stored proc not executing dbms_stats.gather_table_stats() when executing as it string via EXECUTE IMMEDI

In my stored procedure, I am using "EXECUTE IMMEDIATE" to execute statement that is in string format but this is not generating the result. I have added proc below: CREATE OR REPLACE PROC...

stackoverflow.com

 

์˜ˆ์‹œ2. T_ORD_BIG ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„ ์ƒ์„ฑํ•˜๊ธฐ

BEGIN
DBMS_STATS.GATHER_TABLE_STATS('test_user', 'T_ORD_BIG');
END;

 

์˜ˆ์‹œ3. ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” T_ORD_BIG ํ…Œ์ด๋ธ” ์กฐํšŒ - ORD_SEQ๊ฐ€ 343์ธ ๋ฐ์ดํ„ฐ ์นด์šดํŠธํ•˜๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS */
       COUNT(*)
FROM t_ord_big big
WHERE big.ord_seq = 343;

 

์‹คํ–‰๊ณ„ํš ํ™•์ธ

SELECT T1.sql_id, T1.child_number, T1.sql_text
FROM v$sql T1
WHERE T1.sql_text LIKE '%GATHER_PLAN_STATISTICS%'
ORDER BY T1.last_active_time DESC;

SELECT *
FROM TABLE (dbms_xplan.DISPLAY_CURSOR('0bnmdbygb56pk',0,'ALLSTATS LAST'));

 

 

์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ•ด๋ณด๋‹ˆ ์‹œ๊ฐ„์€ 9์ดˆ๊ฐ€ ๊ฑธ๋ ธ๊ณ , ์ „์ฒด Buffers(๋…ผ๋ฆฌ์  IO)๋Š” 258K๊ฐ€ ๋‚˜์™”๋‹ค.

์‹คํ–‰ ์ˆœ์„œ๋Š” ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์ฝ์–ด์„œ ORD_SEQ๊ฐ€ 343์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด์„œ ์นด์šดํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

์ด์ œ WHERE ์กฐ๊ฑด์ ˆ์— ์‚ฌ์šฉ๋œ ORD_SEQ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ๋‹ค.

 

์˜ˆ์‹œ4. ORD_SEQ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ๊ตฌ์„ฑํ•˜๊ธฐ

CREATE INDEX X_T_ORD_BIG_TEST ON T_ORD_BIG(ORD_SEQ);

 

์˜ˆ์‹œ5. ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” T_ORD_BIG ํ…Œ์ด๋ธ” ์กฐํšŒ - ORD_SEQ๊ฐ€ 343์ธ ๋ฐ์ดํ„ฐ ์นด์šดํŠธํ•˜๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS */
       COUNT(*)
FROM t_ord_big big
WHERE big.ord_seq = 343;

 

์‹คํ–‰๊ณ„ํš

 

์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋™์ผํ•œ SQL์„ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ•ด๋ณด๋ฉด ์ˆ˜ํ–‰์‹œ๊ฐ„์ด 9์ดˆ์—์„œ 0.05์ดˆ๋กœ ์ค„์—ˆ๊ณ , ์ „์ฒด Buffers๋„ 258K์—์„œ 24๋กœ ์ข‹์•„์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ธ๋ฑ์Šค(X_T_ORD_BIG_TEST)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ORD_SEQ๊ฐ€ 343์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์€ ํ›„ ์นด์šดํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.

 

6-1-2. ์ธ๋ฑ์Šค์˜ ์ข…๋ฅ˜

์ธ๋ฑ์Šค๋Š” ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(1) ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปฌ๋Ÿผ ์ˆ˜์— ๋”ฐ๋ผ ๊ตฌ๋ถ„

๋‹จ์ผ ์ธ๋ฑ์Šค(Single column index) : ์ธ๋ฑ์Šค์— ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ๋งŒ ์‚ฌ์šฉ

๋ณตํ•ฉ ์ธ๋ฑ์Šค(Composite index) : ์ธ๋ฑ์Šค์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉ

 

๋‹จ์ผ ์ธ๋ฑ์Šค๋Š” PK ์†์„ฑ์ด ๋‹จ์ผ ์ปฌ๋Ÿผ์ผ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ž˜ ๋งŒ๋“ค์–ด์ง„ ํ•˜๋‚˜์˜ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ SQL์˜ ์„ฑ๋Šฅ์„ ์ปค๋ฒ„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋กœ ์—ฌ๋Ÿฌ SQL์„ ์ปค๋ฒ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

SQL๋ณ„๋กœ ํ•„์š”ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

(2) ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปฌ๋Ÿผ ๊ฐ’์˜ ์ค‘๋ณต ํ—ˆ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ตฌ๋ถ„

์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค(Unique index) : ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์ปฌ๋Ÿผ ๊ฐ’์— ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋น„์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค(Non-unique index) : ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์ปฌ๋Ÿผ ๊ฐ’์— ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค.

 

PK ์ œ์•ฝ์กฐ๊ฑด์—๋Š” ๋ฌด์กฐ๊ฑด ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๊ฐ€ ๊ตฌ์„ฑ๋œ๋‹ค. (PK๋Š” ์ž๋™์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ์‹œ์ ๋ถ€ํ„ฐ ์—…๋ฌด์ ์œผ๋กœ ์œ ๋‹ˆํฌํ•œ ์†์„ฑ๋“ค์„ ํŒŒ์•…ํ•ด์„œ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

(3) ์ธ๋ฑ์Šค์˜ ๋ฌผ๋ฆฌ์  ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„

B* ํŠธ๋ฆฌ ์ธ๋ฑ์Šค(B*Tree index) : ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ ์‚ฌ์šฉ, OLTP ์‹œ์Šคํ…œ์€ ๋Œ€๋ถ€๋ถ„ B* ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋น„ํŠธ๋งต ์ธ๋ฑ์Šค(Bitmap index) : ๊ฐ’์˜ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์ง€ ์•Š์€ ์ปฌ๋Ÿผ์— ์‚ฌ์šฉํ•œ๋‹ค.

 

(4) ํŒŒํ‹ฐ์…˜๋œ ์ธ๋ฑ์Šค

๊ธ€๋กœ๋ฒŒ ์ธ๋ฑ์Šค

๋กœ์ปฌ ์ธ๋ฑ์Šค

 

์œ„์˜ ๋ถ„๋ฅ˜๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

6-1-3. B*ํŠธ๋ฆฌ ๊ตฌ์กฐ์™€ ํƒ์ƒ‰ ๋ฐฉ๋ฒ•

์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ณ„๋‹ค๋ฅธ ์˜ต์…˜์„ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด B*ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

B*ํŠธ๋ฆฌ ๊ตฌ์กฐ

  • B(balanced) : ๊ท ํ˜•์ด ์žกํ˜€ ์žˆ๋‹ค, ๋ฆฌํ”„ ๋…ธ๋“œ๋“ค์ด ๊ฐ™์€ ์ˆ˜์ค€(๊นŠ์ด)์— ์ž๋ฆฌํ•ด ์žˆ๋‹ค.
  • *(star) : ๊ทผ์ ‘ํ•œ ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ(link)๋œ ๊ตฌ์กฐ

์ •๋ฆฌํ•ด๋ณด๋ฉด, B* ํŠธ๋ฆฌ๋Š” ๊ท ํ˜•์ด ์žกํ˜€ ์žˆ๊ณ  ๊ทผ์ ‘ํ•œ ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ๋‹ค.

B* ํŠธ๋ฆฌ๋Š” ๋ฃจํŠธ(root, ๋ฟŒ๋ฆฌ), ๋ธŒ๋žœ์น˜(branch, ๊ฐ€์ง€), ๋ฆฌํ”„(leaf, ์žŽ์‚ฌ๊ท€) ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ธ”๋ก์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๋‚˜๋ฌด์—์„œ ๋ฟŒ๋ฆฌ๋Š” ํ•˜๋‚˜์ง€๋งŒ, ๊ฐ€์ง€๋Š” ๋งค์šฐ ๋งŽ๊ณ , ์žŽ์‚ฌ๊ท€๋Š” ๋” ๋งŽ๋“ฏ์ด B* ํŠธ๋ฆฌ๋Š” ์ „์ฒด์ ์œผ๋กœ ์‚ผ๊ฐํ˜• ๋ชจ์–‘์ด ๋œ๋‹ค.

 

์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ธ”๋ก์„ ์ธ๋ฑ์Šค ๋ธ”๋ก์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ธ๋ฑ์Šค ๋ธ”๋ก์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

๋ฃจํŠธ๋Š” ์ž์‹ ์˜ ํ•˜์œ„ ๋ธŒ๋žœ์น˜์™€, ๊ฐ ๋ธŒ๋žœ์น˜๋Š” ๊ฐ๊ฐ ์ž์‹ ์˜ ํ•˜์œ„ ๋ธŒ๋žœ์น˜๋‚˜ ๋ฆฌํ”„ ๋ธ”๋ก๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

๋ฆฌํ”„ ๋ธ”๋ก ๋ฐ‘์œผ๋กœ๋Š” ๋‹ค๋ฅธ ์ธ๋ฑ์Šค ๋ธ”๋ก์€ ์—†๋‹ค.

 

์ธ๋ฑ์Šค ๋ธ”๋ก์˜ ๊ตฌ์„ฑ

๋ฃจํŠธ ๋ธ”๋ก

  • ์ตœ์ƒ์œ„์— ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌ
  • ํ•˜์œ„ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์˜ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’๊ณผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋ธŒ๋žœ์น˜ ๋ธ”๋ก

  • ๋ฃจํŠธ์™€ ๋ฆฌํ”„์˜ ์ค‘๊ฐ„์— ์œ„์น˜, ๋ธŒ๋žœ์น˜๋Š” ์—ฌ๋Ÿฌ ์ธต์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์œ„ ๋ธŒ๋žœ์น˜ ๋˜๋Š” ํ•˜์œ„ ๋ฆฌํ”„์˜ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’๊ณผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋ฆฌํ”„ ๋ธ”๋ก

  • ์ตœํ•˜์œ„์—๋งŒ ์œ„์น˜
  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’๊ณผ ๋ฐ์ดํ„ฐ์˜ ๋กœ์šฐ ์œ„์น˜(ROWID)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋ฆฌํ”„ ๋ธ”๋ก์€ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

 

B* ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ORD_YMD๋กœ ๊ตฌ์„ฑ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด 'ORD_YMD = 20170104'์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๋ณด์ž.

 

(1) ๋ฃจํŠธ ๋ธ”๋ก

์œ„ ๊ทธ๋ฆผ์—์„œ ๋ฃจํŠธ ๋ธ”๋ก(B99)๋ฅผ ๋ณด๋ฉด ์„ธ ๊ฐœ์˜ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก(B05, B06, B01)์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

'20170104'๋Š” ๋นˆ ๊ฐ’๋ณด๋‹ค ํฌ๊ณ  '20170601'๋ณด๋‹ค ์ž‘๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ธŒ๋žœ์น˜ ๋ธ”๋ก ์ค‘์—์„œ B05 ๋ธ”๋ก์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

 

(2) ๋ธŒ๋žœ์น˜ ๋ธ”๋ก

๊ทธ๋ฆผ์—์„œ B05 ๋ธ”๋ก์€ ์„ธ ๊ฐœ์˜ ๋ฆฌํ”„ ๋ธ”๋ก(B02, B10, B21)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

'20170104'๋Š” '20170102'๋ณด๋‹ค ํฌ๊ณ  '20170104'๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ B10์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ B10 ๋’ท๋ถ€๋ถ„์—๋„ '20170104'๊ฐ€ ์ผ๋ถ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— B21์ด ์•„๋‹Œ B10์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

(3) ๋ฆฌํ”„ ๋ธ”๋ก

์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ๋ฆฌํ”„ ๋ธ”๋ก์— ๋„๋‹ฌํ•˜๋ฉด ์ด์ œ๋Š” ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐจ๋ก€๋Œ€๋กœ ์Šค์บ”ํ•ด์•ผ ํ•œ๋‹ค.

์Šค์บ” ์ž‘์—…์€ ์ฐพ์œผ๋ ค๋Š” ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” B10 ๋ธ”๋ก์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์—์„œ ์‹œ์ž‘ํ•ด B21 ๋ธ”๋ก์˜ '20170105'๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์Šค์บ”์ด ์ง„ํ–‰๋œ๋‹ค.

์ด๋•Œ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์Šค์บ”ํ•˜๋ฉด์„œ ROWID๋ฅผ ์ฐธ๊ณ ํ•ด ์‹ค์ œ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ROWID๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ ์ €์žฅ๋œ ์ฃผ์†Œ ๊ฐ’์ด๋‹ค.

ROWID๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •์€ ์‹คํ–‰๊ณ„ํš์— 'TABLE ACCESS BY INDEX ROWID'๋ผ๋Š” ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

6-1-4. ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

์˜ค๋ผํด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

  1. ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ(TABLE ACCESS FULL)
  2. ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ฐพ๊ธฐ(INDEX RANGE SCAN & TABLE ACCESS BY INDEX ROWID)
  3. ROWID๋ฅผ ์ด์šฉํ•œ ์ง์ ‘ ์ฐพ๊ธฐ(TABLE ACCESS BY INDEX ROWID)

 

6-1-5. ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ• - ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ

ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ชจ๋‘ ์ฝ์œผ๋ฉด์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์‹คํ–‰๊ณ„ํš์— 'TABLE ACCESS FULL'๋กœ ํ‘œํ˜„๋œ๋‹ค.

ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ๋Š” ์ฐพ๊ณ ์ž ํ•˜๋Š” ์กฐ๊ฑด์— ํ™œ์šฉํ•  ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์˜ค๋ผํด์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋  ๋•Œ๋Š” ํŠน์ • ์ˆœ์„œ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

ํ…Œ์ด๋ธ” ๋‚ด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ๋„ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

๋”ฐ๋ผ์„œ ์˜ค๋ผํด์€ ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ์žˆ๊ณ , ์ •ํ™•ํžˆ ๋ช‡ ๊ฑด ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

๋ชจ๋“  ํ…Œ์ด๋ธ” ๋ธ”๋ก์„ ์ฝ์–ด์•ผ๋งŒ ์กฐ๊ฑด์ด ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ์ง์—†์ด ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

WHERE ์กฐ๊ฑด์ ˆ์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์— ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ(TABLE ACCESS FULL)๋งŒ์ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์˜ˆ์‹œ1. TABLE ACCESS FULL์„ ์‚ฌ์šฉํ•˜๋Š” SQL - ๊ณ ๊ฐ๋ณ„ '20170316' ์ผ์ž์˜ ์ฃผ๋ฌธ ๊ฑด์ˆ˜ ์ฐพ๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS */
       T1.cus_id
       , count(*) ORD_CNT
FROM t_ord_big T1
WHERE T1.ord_ymd = '20170316'
GROUP BY T1.cus_id
ORDER BY T1.cus_id;

 

์‹คํ–‰๊ณ„ํš

 

์œ„ ์‹คํ–‰๊ณ„ํš 2๋ฒˆ ์˜คํผ๋ ˆ์ด์…˜์„ ๋ณด๋ฉด TABLE ACCESS FULL์ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

TABLE ACCESS FULL์€ ํ…Œ์ด๋ธ” ๋ธ”๋ก ์ „์ฒด๋ฅผ ์ฝ๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ…Œ์ด๋ธ”์ด ํด์ˆ˜๋ก ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

๋งŒ์•ฝ์— ์ฒœ๋งŒ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๊ฑด์ด๋ผ๋ฉด TABLE ACCESS FULL์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ฒœ๋งŒ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์—์„œ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฑ๋งŒ ๊ฑด ์ •๋„ ๋œ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค TABLE ACCESS FULL์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ TABLE ACCESS FULL์ด ๋ฌด์กฐ๊ฑด ์„ฑ๋Šฅ์ด ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

6-1-6. ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ• - ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ฐพ๊ธฐ

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ฐพ๊ธฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

'INDEX RANGE SCAN', 'INDEX SKIP SCAN', 'INDEX FULL SCAN' ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ, ์ด ์ฑ…์—์„œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ธ 'INDEX RANGE SCAN'์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ํ•„์š”์— ๋”ฐ๋ผ 'TABLE ACCESS BY INDEX ROWID' ์ž‘์—…์„ ๋™๋ฐ˜ํ•œ๋‹ค.

 

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ์ „์ฒด์ ์œผ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ๋ฃจํ”„์—์„œ ๋ฆฌํ”„๋กœ : ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ๋Š” ๊ณผ์ •

2. ๋ฆฌํ”„ ๋ธ”๋ก ์Šค์บ” : ์ฐพ์•„๋‚ธ ์ง€์ ๋ถ€ํ„ฐ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์–ด ๊ฐ€๋Š” ๊ณผ์ •

3. ํ…Œ์ด๋ธ” ์ ‘๊ทผ : ๋ฆฌํ”„ ๋ธ”๋ก์„ ์Šค์บ”ํ•˜๋ฉด์„œ ํ•„์š”์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •

 

์œ„ ์„ค๋ช…์—์„œ 1๋ฒˆ๊ณผ 2๋ฒˆ์„ ๋ฌถ์–ด์„œ 'INDEX RANGE SCAN'์ด๋ผ๊ณ  ํ•œ๋‹ค.

'INDEX RANGE SCAN'์€ ํ•„์š”์— ๋”ฐ๋ผ 'TABLE ACCESS BY INDEX ROWID' ์ž‘์—…์„ ๋™๋ฐ˜ํ•œ๋‹ค. 

 

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(1) ๋ฃจํŠธ์—์„œ ๋ฆฌํ”„๋กœ (๋ฆฌํ”„ ๋ธ”๋ก ์ฐพ๊ธฐ)

๋ฃจํŠธ ๋ธ”๋ก์—์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ด ์ €์žฅ๋œ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์€ ๋ถ€ํ•˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋  ์ •๋„๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

(2) ๋ฆฌํ”„ ๋ธ”๋ก ์Šค์บ”(RANGE SCAN)

๋ฆฌํ”„ ๋ธ”๋ก์€ ์ธ๋ฑ์Šค์˜ ํ‚ค ์ปฌ๋Ÿผ์ธ ORD_YMD ์ปฌ๋Ÿผ ๊ฐ’์˜ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ORD_YMD๊ฐ€ '20170103'์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ๋‹ค.

'๋ฃจํŠธ์—์„œ ๋ฆฌํ”„๋กœ' ๊ณผ์ •์—์„œ '20170103'์ด ์ตœ์ดˆ๋กœ ์ €์žฅ๋œ 3๋ฒˆ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ์•„๋ƒˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

3๋ฒˆ ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฐพ์•„๋‚ธ ํ›„์—๋Š” ๋ฆฌํ”„ ๋ธ”๋ก ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์–ด ๋‚˜๊ฐ„๋‹ค. ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์–ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์€ ORD_YMD๊ฐ€ '20170103'๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€๋‹ค.

์ด ๊ณผ์ •์ด ๋ฆฌํ”„ ๋ธ”๋ก ์Šค์บ”์ด๋‹ค.

 

(3) ํ…Œ์ด๋ธ” ์ ‘๊ทผ(TABLE ACCESS BY INDEX ROWID)

'๋ฆฌํ”„ ๋ธ”๋ก ์Šค์บ”' ๊ณผ์ •์—์„œ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•œ๋‹ค.

์ธ๋ฑ์Šค ๋ฆฌํ”„ ๋ธ”๋ก์˜ ROWID ๊ฐ’์„ ์ฐธ์กฐํ•ด ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์€ ํ…Œ์ด๋ธ”์— ํ•„์š”ํ•œ ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์ผ์–ด๋‚œ๋‹ค. ๋งŒ์•ฝ์— ORD_YMD ๊ฐ’๋งŒ ์‚ฌ์šฉํ•ด SQL์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ๊ณผ์ •์€ ์ƒ๋žต๋œ๋‹ค.

 

์ด์ œ ์‹ค์ œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธํ•ด๋ณด์ž.

 

์˜ˆ์‹œ1. INDEX RANGE SCAN์„ ์‚ฌ์šฉํ•˜๋Š” SQL

ORD_YMD ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ๊ตฌ์„ฑํ•˜๊ธฐ

CREATE INDEX X_T_ORD_BIG_1 ON t_ord_big(ord_ymd);

 

๊ณ ๊ฐ๋ณ„ ord_ymd๊ฐ€ '20170316'์ธ ์ฃผ๋ฌธ ๊ฑด์ˆ˜ ์นด์šดํŠธํ•˜๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS INDEX(T1 X_T_ORD_BIG_1) */
       T1.cus_id
       , count(*) ord_cnt
FROM t_ord_big T1
WHERE T1.ord_ymd = '20170316'
GROUP BY T1.cus_id
ORDER BY T1.cus_id;

 

INDEX(T1 X_T_ORD_BIG_1) ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ๋‹ค.

ํžŒํŠธ๋Š” SQL ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•(์‹คํ–‰๊ณ„ํš)๋งŒ ๋ณ€๊ฒฝํ•  ๋ฟ ์‹คํ–‰ ๊ฒฐ๊ณผ์—๋Š” ์ ˆ๋Œ€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

์‹คํ–‰๊ณ„ํš

 

WHERE ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด 'INDEX RANGE SCAN'์„ ์‚ฌ์šฉํ–ˆ๊ณ , ์ธ๋ฑ์Šค์— ์—†๋Š” 'cus_id' ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด 'TABLE ACCESS BY INDEX ROWID' ์ž‘์—…๊นŒ์ง€ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

 

(์ฐธ๊ณ ) X_T_ORD_BIG_1 ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ SQL์€ ์ฒ˜์Œ ์‹คํ–‰์—๋Š” 9.4์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์‹คํ–‰๋ถ€ํ„ฐ๋Š” 1.57์ดˆ ์ •๋„๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์‹คํ–‰๋ถ€ํ„ฐ๋Š” ๋ฌผ๋ฆฌ์ IO์—†์ด ๋…ผ๋ฆฌ์ IO๋กœ๋งŒ SQL์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

6-1-7. INDEX RANGE SCAN VS. TABLE ACCESS FULL

๋žœ๋ค ์—‘์„ธ์Šค(RANDOM ACCESS)

IO ์ž‘์—… ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ๋œปํ•œ๋‹ค.

์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„ ๋ธ”๋ก์—์„œ ROWID๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•  ๋•Œ ๋žœ๋ค ์—‘์„ธ์Šค๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์‹คํ–‰๊ณ„ํš์—๋Š” 'TABLE ACCESS BY INDEX ROWID'๋กœ ํ‘œ์‹œ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ, '์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ฐพ๊ธฐ'์™€ 'ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ'์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด ๋ณด์ž.

 

์˜ˆ์‹œ1. ORD_YMD ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ๋” ์ข‹์€ SQL

SELECT /*+ GATHER_PLAN_STATISTICS */
       T1.cus_id
       , count(*) ord_cnt
FROM t_ord_big T1
WHERE T1.ord_ymd = '20170316'
GROUP BY T1.cus_id
ORDER BY T1.cus_id;

 

WHERE ์กฐ๊ฑด์ ˆ์„ ๋ณด๋ฉด ord_ymd๊ฐ€ '20170316'์ธ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์žˆ๋‹ค.

t_ord_big ํ…Œ์ด๋ธ”์—๋Š” ์ด 3์ฒœ๋งŒ ๊ฑด ์ •๋„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ ์ค‘์— ord_ymd๊ฐ€ '20170316'์ธ ๋ฐ์ดํ„ฐ๋Š” 5๋งŒ ๊ฑด์ด๋‹ค.

3์ฒœ๋งŒ ๊ฑด์—์„œ 5๋งŒ ๊ฑด ์ •๋„๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด 'INDEX RANGE SCAN'์ด ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

(์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ธ”๋ก ์ˆ˜๋กœ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.)

 

์˜ˆ์‹œ2. ORD_YMD ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ์•ˆ์ข‹์€ SQL

SELECT /*+ GATHER_PLAN_STATISTICS INDEX(T1 X_T_ORD_BIG_1) */
       T1.ord_st
       , sum(ord_amt) sum_amt
FROM t_ord_big T1
WHERE T1.ord_ymd >= '20170401'
AND   T1.ord_ymd < '20170701'
GROUP BY T1.ord_st;

 

t_ord_big ํ…Œ์ด๋ธ”์—์„œ 3๊ฐœ์›” ๊ฐ„์˜ ์ฃผ๋ฌธ์„ ์กฐํšŒํ•œ๋‹ค.

์•ฝ 7,650,000 ๊ฑด์— ๋‹ฌํ•˜๋Š” ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋‹ค.

 

์‹คํ–‰๊ณ„ํš

 

X_T_ORD_BIG_1 ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํžŒํŠธ๋ฅผ ์ฃผ์—ˆ๋‹ค.

์ด SQL์€ 4๋ถ„์ด ๊ฑธ๋ฆฐ๋‹ค. ์ „์ฒด Buffers๋ฅผ ์‚ดํŽด๋ณด๋ฉด 1011K๋‹ค. ๋งŽ์€ ๋…ผ๋ฆฌ์  IO๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด 'TABLE ACCESS BY INDEX ROWID'๊ฐ€ 7,650K๋ฒˆ ์‹คํ–‰๋˜์—ˆ๋‹ค.

'TABLE ACCESS BY INDEX ROWID'๋Š” ๋ฐ”๋กœ ์ „ ๋‹จ๊ณ„์ธ 'INDEX RANGE SCAN'์˜ A-rows๋งŒํผ ์‹คํ–‰๋œ๋‹ค.

์ฆ‰, ๋งค์šฐ ๋งŽ์€ ๋žœ๋ค ์—‘์„ธ์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ3. ํ…Œ์ด๋ธ” ์ „์ฒด ์ฝ๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ๋” ์ข‹์€ SQL

SELECT /*+ GATHER_PLAN_STATISTICS FULL(T1) */
       T1.ord_st
       , sum(ord_amt) sum_amt
FROM t_ord_big T1
WHERE T1.ord_ymd >= '20170401'
AND   T1.ord_ymd < '20170701'
GROUP BY T1.ord_st;

 

์‹คํ–‰๊ณ„ํš

 

'FULL(T1)' ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž ์ธ๋ฑ์Šค๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ๋ณด๋‹ค ์†๋„๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค.

์ด ์‹คํ–‰ ์‹œ๊ฐ„์ด 4๋ถ„์—์„œ 1๋ถ„ 21์ดˆ๋กœ ๋‹จ์ถ•๋˜์—ˆ๋‹ค. Buffers ์ˆ˜์น˜๋„ 1011K์—์„œ 258K๋กœ ์ข‹์•„์กŒ๋‹ค.

์ฆ‰, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํŠน์ • ์ˆ˜์ค€ ์ด์ƒ์œผ๋กœ ๋งŽ์œผ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ '๋žœ๋ค ์—‘์„ธ์Šค'๋ณด๋‹ค 'FULL SCAN' ๋ฐฉ์‹์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

 

์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋งŽ๋‹ค๋ฉด 'FULL SCAN'์ด ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

ํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ์Œ“์ด๋Š” ๊ตฌ์กฐ๋ผ๋ฉด 'FULL SCAN' ๋ฐฉ์‹์€ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ๋” ๋‚˜๋น ์ง„๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ผ๋‚ด๊ฑฐ๋‚˜ ํŒŒํ‹ฐ์…˜ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋˜๋Š” ์ค‘๊ฐ„ ์ง‘๊ณ„ ํ…Œ์ด๋ธ” ๋“ฑ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค๋ฉด 'INDEX RANGE SCAN'์ด ์œ ๋ฆฌํ•˜๋‹ค.

2. ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค๋ฉด 'FULL SCAN'์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ํ•˜์ง€๋งŒ 'FULL SCAN'์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ผ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ ์ฐจ ๋‚˜๋น ์ง„๋‹ค. ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค.

 

๋”ฐ๋ผ์„œ SQL ์„ฑ๋Šฅ์„ ๋†’์ด๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ๋ฌด์กฐ๊ฑด ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๊ฐ€ ๊ณผ์—ฐ ์„ฑ๋Šฅ์— ๋„์›€์ด ๋ ์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ