Oracle/Tuning2020. 7. 8. 10:24

์—ฌ๋ถ€ ์†์„ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด์ž.


ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์•„๋ž˜์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์ž. t1์„ ์ „๋ฌธ ์ „์†ก ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ •ํ•˜์ž.

-- 1
DROP TABLE t1 PURGE;

CREATE TABLE t1 AS
SELECT ROWNUM AS id
     , LPAD ('X', 4000, 'X') AS doc
     , CASE WHEN ROWNUM > 9990 THEN 'N' ELSE 'Y' END AS if_yn
  FROM XMLTABLE ('1 to 10000');

ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);

EXEC DBMS_STATS.GATHER_TABLE_STATS ('SCOTT', 'T1', method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY');

์ „๋ฌธ ์ „์†ก์€ ๋ณดํ†ต ์•„๋ž˜์˜ ์ฒ ์ฐจ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. if_yn์ด N์ธ ๋ฏธ์ „์†ก ์ „๋ฌธ์„ ์ „์†กํ•˜๊ณ , ์ „์†ก์ด ์™„๋ฃŒ๋˜๋ฉด if_yn ๊ฐ’์„ Y๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

-- 2
BEGIN
    FOR f1 IN (SELECT * FROM t1 WHERE if_yn = 'N' ORDER BY id)
    LOOP
        -- ์ „์†ก
        UPDATE t1 SET if_yn = 'Y' WHERE c1 = f1.c1;
    END LOOP;
END;

์•„๋ž˜๋Š” CURSOR FOR LOOP ๋ฌธ์˜ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์ด๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฏ€๋กœ t1 ํ…Œ์ด๋ธ”์„ ์ „์ฒด ์Šค์บ”ํ•œ๋‹ค. ์ „๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ…Œ์ด๋ธ” ํฌ๊ธฐ๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ๋ธ”๋ก I/O๋„ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.[๊ฐ์ฃผ:1]

-- 3
SELECT * FROM t1 WHERE if_yn = 'N' ORDER BY id;

------------------------------------------------------
| Id  | Operation          | Name | A-Rows | Buffers |
------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     10 |   10012 |
|   1 |  SORT ORDER BY     |      |     10 |   10012 |
|*  2 |   TABLE ACCESS FULL| T1   |     10 |   10012 |
------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("IF_YN"='N')

์•„๋ž˜๋Š” if_yn ์นผ๋Ÿผ์˜ ํ†ต๊ณ„ ์ •๋ณด๋‹ค. num_distinct๊ฐ€ 2์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋Œ€์ƒ์ด ์•„๋‹Œ ์นผ๋Ÿผ์œผ๋กœ ์˜คํŒํ•  ์ˆ˜ ์žˆ๋‹ค.
-- 4
SELECT num_distinct, histogram FROM user_tab_columns WHERE table_name = 'T1' AND column_name = 'IF_YN';

NUM_DISTINCT HISTOGRAM
------------ ---------
           2 FREQUENCY

1๊ฐœ์˜ ํ–‰์ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด๋ณด๋ฉด if_yn์ด N์ธ ํ–‰์€ 10๊ฑด์— ๋ถˆ๊ณผํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ „๋ฌธ ์ „์†ก์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋ฏธ์ „์†ก ๊ฑด์€ ํ•ญ์ƒ ์ ์„ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

-- 5
SELECT if_yn, COUNT (*) AS cnt FROM t1 GROUP BY if_yn;

IF_YN  CNT
----- ----
Y     9990
N       10

2 ํ–‰์ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด if_yn ์นผ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ž.
-- 6
CREATE INDEX t1_x1 ON t1 (if_yn);

์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค ์Šค์บ”์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ๋ธ”๋ก I/O๊ฐ€ 10,012์—์„œ 12๋กœ ๊ฐ์†Œํ–ˆ๋‹ค. ์ „๋ฌธ ์ „์†ก์ด 1๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ์ผ๋ณ„ 14,400,000๊ฐœ์˜ ๋ธ”๋ก I/O๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

-- 7
SELECT * FROM t1 WHERE if_yn = 'N' ORDER BY id;

-----------------------------------------------------------------
| Id  | Operation                    | Name  | A-Rows | Buffers |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT             |       |     10 |      12 |
|   1 |  SORT ORDER BY               |       |     10 |      12 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T1    |     10 |      12 |
|*  3 |    INDEX RANGE SCAN          | T1_X1 |     10 |       2 |
-----------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("IF_YN"='N')

์ถ”๊ฐ€๋กœ if_yn ์นผ๋Ÿผ์— ํžˆ์Šคํ† ๊ทธ๋žจ์ด ์ƒ์„ฑํ•˜๋ฉด ์ธ๋ฑ์Šค ์ƒ์„ฑ์œผ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” if_yn๋ฅผ Y๋กœ ์กฐํšŒํ–ˆ๋‹ค. ํžˆ์Šคํ† ๊ทธ๋žจ์œผ๋กœ ์ธํ•ด ์ธ๋ฑ์Šค๋ฅผ ์Šค์บ”ํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ”์„ ์ „์ฒด ์Šค์บ”ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 8
SELECT * FROM t1 WHERE if_yn = 'Y';

-----------------------------------------------------
| Id  | Operation         | Name | A-Rows | Buffers |
-----------------------------------------------------
|   0 | SELECT STATEMENT  |      |   9990 |   10011 |
|*  1 |  TABLE ACCESS FULL| T1   |   9990 |   10011 |
-----------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("IF_YN"='Y')


  1. ์ด๋Ÿฐ ๋ฅ˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์‹œํ•œํญํƒ„์— ๋น„์œ ํ•˜๊ณค ํ•œ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
Posted by ์ •ํฌ๋ฝ_