์ฌ๋ถ ์์ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์.
ํ ์คํธ๋ฅผ ์ํด ์๋์ ํ ์ด๋ธ์ ์์ฑํ์. t1์ ์ ๋ฌธ ์ ์ก ํ ์ด๋ธ๋ก ๊ฐ์ ํ์.
1 2 3 4 5 6 7 8 9 10 11 12 |
-- 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๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ค.
1 2 3 4 5 6 7 8 |
-- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- 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' ) |
1 2 3 4 5 6 7 8 |
-- 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๊ฑด์ ๋ถ๊ณผํ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ ๋ฌธ ์ ์ก์ ํน์ฑ์ ๋ฐ๋ผ ๋ฏธ์ ์ก ๊ฑด์ ํญ์ ์ ์ ์ ๋ฐ์ ์๋ค.
1 2 3 4 5 6 7 8 9 |
-- 5 SELECT if_yn, COUNT (*) AS cnt FROM t1 GROUP BY if_yn; IF_YN CNT ----- ---- Y 9990 N 10 2 ํ์ด ์ ํ๋์์ต๋๋ค. |
1 2 3 4 |
-- 6 CREATE INDEX t1_x1 ON t1 (if_yn); ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์์ต๋๋ค. |
์ฟผ๋ฆฌ๋ฅผ ๋ค์ ์ํํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค ์ค์บ์ผ๋ก ์ํ๋๋ค. ๋ธ๋ก I/O๊ฐ 10,012์์ 12๋ก ๊ฐ์ํ๋ค. ์ ๋ฌธ ์ ์ก์ด 1๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์ํ๋๋ค๋ฉด ์ผ๋ณ 14,400,000๊ฐ์ ๋ธ๋ก I/O๋ฅผ ๊ฐ์์ํฌ ์ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- 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๋ก ์กฐํํ๋ค. ํ์คํ ๊ทธ๋จ์ผ๋ก ์ธํด ์ธ๋ฑ์ค๋ฅผ ์ค์บํ์ง ์๊ณ ํ ์ด๋ธ์ ์ ์ฒด ์ค์บํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-- 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' ) |
- ์ด๋ฐ ๋ฅ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ํํญํ์ ๋น์ ํ๊ณค ํ๋ค. [๋ณธ๋ฌธ์ผ๋ก]
'Oracle > Tuning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฟผ๋ฆฌ ๋ณํ์ ํตํ Top-N ์ฟผ๋ฆฌ ์ฑ๋ฅ ๊ฐ์ ์ฌ๋ก (0) | 2020.09.16 |
---|---|
์ฌ๋ถ ์์ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ ์ฌ๋ก #2 (0) | 2020.07.09 |
๋ทฐ ๋ณํฉ์ด ๋์ํ์ง ์๋ ์ฌ๋ก (0) | 2020.04.07 |
์กฐ์ธ์ ๋ฐ๋ฅธ ์ฌ์ฉ์ ํจ์์ ๋์ (0) | 2020.03.21 |
์ ๊ธฐ์ค ์ด๋ ฅ ์กฐํ (0) | 2020.03.16 |