Oracle/Tuning2020. 7. 9. 10:27

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


ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์•„๋ž˜์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์ž. t1 ํ…Œ์ด๋ธ”์„ ๊ณ ๊ฐ๋ณ„ ์ƒํ’ˆ ์กฐํšŒ ์ด๋ ฅ ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ •ํ•˜์ž.

-- 1-1
DROP TABLE t1 PURGE;

CREATE TABLE t1 AS
SELECT 1 AS id
     , ROWNUM AS cd
     , DATE '2050-01-01' - NUMTODSINTERVAL (ROWNUM, 'MINUTE') AS dt
     , 'N' AS del_yn
  FROM XMLTABLE ('1 to 144000');

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

-- 1-2
UPDATE t1
   SET del_yn = 'Y'
 WHERE id = 1
   AND dt < DATE '2049-12-31' - 30;

COMMIT;

๊ณ ๊ฐ์ด 2050-01-01์— ๋กœ๊ทธ์ธํ•˜๋ฉด ์•„๋ž˜ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. 30์ผ ์ด์ „์˜ ์ƒํ’ˆ ์กฐํšŒ ์ด๋ ฅ์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ์ฒ˜๋ฆฌ๋‹ค.

-- 2
UPDATE t1
   SET del_yn = 'Y'
 WHERE id = 1
   AND dt < DATE '2050-01-01' - 30;

UPDATE ๋ฌธ์„ SELECT ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ•ด๋ณด๋ฉด ๊ฐฑ์‹  ๋Œ€์ƒ์ด 10๋งŒ๊ฑด ์ด์ƒ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.[๊ฐ์ฃผ:1]
-- 3
SELECT del_yn
  FROM t1
 WHERE id = 1
   AND dt < DATE '2050-01-01' - 30;

----------------------------------------------------------------
| Id  | Operation                   | Name  | A-Rows | Buffers |
----------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |    100K|    1045 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1    |    100K|    1045 |
|*  2 |   INDEX RANGE SCAN          | T1_PK |    100K|     623 |
----------------------------------------------------------------

์—…๋ฌด์ ์œผ๋กœ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ ๋…ผ๋ฆฌ ์‚ญ์ œ๊ฐ€ ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด del_yn = 'N' ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐฑ์‹  ๋Œ€์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.[๊ฐ์ฃผ:2] ๋ถˆํ•„์š”ํ•œ ๊ฐฑ์‹ ์„ ๋ฐฉ์ง€ํ•จ์œผ๋กœ์จ ๋กœ๊น… ๋ถ€ํ•˜๊ฐ€ ๊ฐ์†Œํ–ˆ์ง€๋งŒ ๋ธ”๋ก I/O๋Š” ์—ฌ์ „ํžˆ ๋†’๋‹ค.

-- 4
SELECT del_yn
  FROM t1
 WHERE id = 1
   AND dt < DATE '2050-01-01' - 30
   AND del_yn = 'N' -- ์ถ”๊ฐ€
;

----------------------------------------------------------------
| Id  | Operation                   | Name  | A-Rows | Buffers |
----------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |   1440 |     848 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| T1    |   1440 |     848 |
|*  2 |   INDEX RANGE SCAN          | T1_PK |    100K|     524 |
----------------------------------------------------------------

์•„๋ž˜์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ž. NDV๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋“ฑํ˜ธ(=)๋กœ ์ž…๋ ฅ๋œ del_yn ์นผ๋Ÿผ์ด ๋ฒ”์œ„๋กœ ์ž…๋ ฅ๋œ dt ์นผ๋Ÿผ๋ณด๋‹ค ์•ž์ชฝ์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.
-- 5
CREATE INDEX t1_x1 ON t1 (id, del_yn, dt);

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

์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ธ”๋ก I/O๊ฐ€ 9๋กœ ๊ฐ์†Œํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 6
SELECT del_yn
  FROM t1
 WHERE id = 1
   AND dt < DATE '2050-01-01' - 30
   AND del_yn = 'N';

----------------------------------------------------
| Id  | Operation        | Name  |A-Rows | Buffers |
----------------------------------------------------
|   0 | SELECT STATEMENT |       |  1440 |       9 |
|*  1 |  INDEX RANGE SCAN| T1_X1 |  1440 |       9 |
----------------------------------------------------


  1. ์ผ์ „์— ์–ธ๊ธ‰ํ•œ ์‹œํ•œํญํƒ„ ์œ ํ˜•์ด๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
  2. 1๋ถ„์— 1๊ฐœ์˜ ์ƒํ’ˆ์„ ์กฐํšŒํ•˜๊ณ  1์ผ์— 1ํšŒ ๋กœ๊ทธ์ธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ฐฑ์‹  ๋Œ€์ƒ์ด ์ตœ๋Œ€ 1440๊ฑด์ด๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
Posted by ์ •ํฌ๋ฝ_