Oracle/Tuning2020. 3. 21. 09:54

์กฐ์ธ์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ์ž ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ์‚ดํŽด๋ณด์ž.


ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”๊ณผ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์ž.

-- 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์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ๋‹ค.

-- 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์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ๋‹ค. ์กฐ์ธ ๋Œ€์ƒ์„ ๊ฐ๊ฐ ์•ก์„ธ์Šคํ•˜๋Š” ํ•ด์‹œ ์กฐ์ธ์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ํ˜„์ƒ์ด๋‹ค.

-- 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์ดˆ๋กœ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์กฐ์ธ ๋ถ€ํ•˜์™€ ํ•จ์ˆ˜ ๋ถ€ํ•˜์˜ ๋น„์œจ์— ๋”ฐ๋ผ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.

-- 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")

์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์•„๋ž˜์ฒ˜๋Ÿผ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ ์กฐ๊ฑด์„ ์กฐ์ธ์˜ ํ•„ํ„ฐ ์กฐ๊ฑด์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

-- 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๊ฐ€ ์ ๋‹ค๋ฉด ์บ์‹ฑ ํšจ๊ณผ๋ฅผ ์œ„ํ•ด ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์กฐ์ธ ํ›„ ํ•„ํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

-- 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")


Posted by ์ •ํฌ๋ฝ_