์กฐ์ธ์ ๋ฐ๋ฅธ ์ฌ์ฉ์ ํจ์์ ๋์์ ์ดํด๋ณด์.
ํ ์คํธ๋ฅผ ์ํด ์๋์ ๊ฐ์ด ํ ์ด๋ธ๊ณผ ํจ์๋ฅผ ์์ฑํ์.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 AS SELECT ROWNUM AS c1 FROM XMLTABLE ( '1 to 10' ); CREATE TABLE t2 AS SELECT DECODE (c1, 1, 1, c1 + 10) AS c1 FROM t1; CREATE OR REPLACE FUNCTION f1 (i_c1 IN NUMBER, i_second IN NUMBER) RETURN NUMBER IS BEGIN DBMS_LOCK.SLEEP (i_second); RETURN 1; END ; / |
์๋ ์ฟผ๋ฆฌ๋ t2 ํ ์ด๋ธ์ NL ์กฐ์ธํ์ฌ 99๊ฐ์ ๋ธ๋ก I/O๊ฐ ๋ฐ์ํ๋ค. f1 ํจ์๋ ์กฐ์ธ์ด ์ฑ๊ณตํ 1ํ๋ง ์ํ๋์ด ์ฟผ๋ฆฌ ์ํ์ 0.1์ด๊ฐ ์์๋์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
-- 2 SELECT /*+ LEADING(A) USE_NL(B) */ * FROM t1 a, t2 b WHERE b.c1 = a.c1 AND f1 (b.c1, 0.1) = 1; ---------------------------------------------------------------------------- | Id | Operation | Name | Starts | A- Rows | A- Time | Buffers | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:00.11 | 99 | | 1 | NESTED LOOPS | | 1 | 1 |00:00:00.11 | 99 | | 2 | TABLE ACCESS FULL | T1 | 1 | 10 |00:00:00.01 | 9 | |* 3 | TABLE ACCESS FULL | T2 | 10 | 1 |00:00:00.11 | 90 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(( "B" . "C1" = "A" . "C1" AND "F1" ( "B" . "C1" ,.1)=1)) |
์๋ ์ฟผ๋ฆฌ๋ ํด์ ์กฐ์ธ์ผ๋ก ์ํ๋์ด ๋ธ๋ก I/O๊ฐ 21๊ฐ๋ก ๊ฐ์ํ์ง๋ง, f1 ํจ์๊ฐ 10ํ ์ํ๋์ด ์ฟผ๋ฆฌ ์ํ์ 1.1์ด๊ฐ ์์๋์๋ค. ์กฐ์ธ ๋์์ ๊ฐ๊ฐ ์ก์ธ์คํ๋ ํด์ ์กฐ์ธ์ ํน์ฑ์ผ๋ก ์ธํ ํ์์ด๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- 3 SELECT /*+ LEADING(A) USE_HASH(B) */ * FROM t1 a, t2 b WHERE b.c1 = a.c1 AND f1 (b.c1, 0.1) = 1; ---------------------------------------------------------------------------- | Id | Operation | Name | Starts | A- Rows | A- Time | Buffers | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:01.10 | 21 | |* 1 | HASH JOIN | | 1 | 1 |00:00:01.10 | 21 | | 2 | TABLE ACCESS FULL | T1 | 1 | 10 |00:00:00.01 | 9 | |* 3 | TABLE ACCESS FULL | T2 | 1 | 1 |00:00:01.09 | 9 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access( "B" . "C1" = "A" . "C1" ) 3 - filter( "F1" ( "B" . "C1" ,.1)=1) |
์๋ ์ฟผ๋ฆฌ์ฒ๋ผ ์กฐ์ธ ํ ํจ์๋ฅผ ์ํํ๋ฉด ํจ์๊ฐ 1ํ๋ง ์ํ๋์ด ์ํ ์๊ฐ์ด 0.1์ด๋ก ๊ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์กฐ์ธ ๋ถํ์ ํจ์ ๋ถํ์ ๋น์จ์ ๋ฐ๋ผ ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ๋จํด์ผ ํ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- 4 SELECT * FROM ( SELECT /*+ NO_MERGE LEADING(A) USE_HASH(B) */ a.c1 AS ac1, b.c1 AS bc1 FROM t1 a, t2 b WHERE b.c1 = a.c1) WHERE f1 (bc1, 0.1) = 1; ----------------------------------------------------------------------------- | Id | Operation | Name | Starts | A- Rows | A- Time | Buffers | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:00.11 | 21 | |* 1 | VIEW | | 1 | 1 |00:00:00.11 | 21 | |* 2 | HASH JOIN | | 1 | 1 |00:00:00.01 | 21 | | 3 | TABLE ACCESS FULL | T1 | 1 | 10 |00:00:00.01 | 9 | | 4 | TABLE ACCESS FULL | T2 | 1 | 10 |00:00:00.01 | 9 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter( "F1" ( "BC1" ,.1)=1) 2 - access( "B" . "C1" = "A" . "C1" ) |
์ฟผ๋ฆฌ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ์๋์ฒ๋ผ ํจ์๊ฐ ์ฌ์ฉ๋ ์กฐ๊ฑด์ ์กฐ์ธ์ ํํฐ ์กฐ๊ฑด์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- 5 SELECT /*+ LEADING(A) USE_HASH(B) */ * FROM t1 a, t2 b WHERE b.c1 = a.c1 AND f1 (b.c1, 0.1) + a.c1 = 1 + a.c1; ---------------------------------------------------------------------------- | Id | Operation | Name | Starts | A- Rows | A- Time | Buffers | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:00.11 | 21 | |* 1 | HASH JOIN | | 1 | 1 |00:00:00.11 | 21 | | 2 | TABLE ACCESS FULL | T1 | 1 | 10 |00:00:00.01 | 9 | | 3 | TABLE ACCESS FULL | T2 | 1 | 10 |00:00:00.01 | 9 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access( "B" . "C1" = "A" . "C1" ) filter( "F1" ( "B" . "C1" ,.1)+ "A" . "C1" =1+ "A" . "C1" ) |
ํจ์ ์ธ์์ NDV๊ฐ ์ ๋ค๋ฉด ์บ์ฑ ํจ๊ณผ๋ฅผ ์ํด ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์๋ธ ์ฟผ๋ฆฌ๋ ์กฐ์ธ ํ ํํฐ ๋ฐฉ์์ผ๋ก ์ํ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- 6 SELECT /*+ LEADING(A) USE_HASH(B) */ * FROM t1 a, t2 b WHERE b.c1 = a.c1 AND ( SELECT f1 (b.c1, 0.1) FROM DUAL) = 1; ----------------------------------------------------------------------------- | Id | Operation | Name | Starts | A- Rows | A- Time | Buffers | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 |00:00:00.11 | 21 | |* 1 | FILTER | | 1 | 1 |00:00:00.11 | 21 | |* 2 | HASH JOIN | | 1 | 1 |00:00:00.01 | 21 | | 3 | TABLE ACCESS FULL | T1 | 1 | 10 |00:00:00.01 | 9 | | 4 | TABLE ACCESS FULL | T2 | 1 | 10 |00:00:00.01 | 9 | | 5 | FAST DUAL | | 1 | 1 |00:00:00.01 | 0 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(=1) 2 - access( "B" . "C1" = "A" . "C1" ) |
'Oracle > Tuning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฌ๋ถ ์์ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ ์ฌ๋ก #1 (0) | 2020.07.08 |
---|---|
๋ทฐ ๋ณํฉ์ด ๋์ํ์ง ์๋ ์ฌ๋ก (0) | 2020.04.07 |
์ ๊ธฐ์ค ์ด๋ ฅ ์กฐํ (0) | 2020.03.16 |
INDEX ํํธ์ ์ธ ๊ฐ์ง ๋ฐฉ์ (0) | 2020.02.23 |
NOT EXISTS ์๋ธ ์ฟผ๋ฆฌ๊ฐ UNNEST๋์ง ์๋ ์ฌ๋ก (0) | 2020.02.21 |