Oracle/Tuning2020. 4. 7. 16:40

๋ทฐ ๋ณ‘ํ•ฉ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์•„ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด์ž.


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

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
DROP TABLE t3 PURGE;

CREATE TABLE t1 AS SELECT ROWNUM AS c1, ROWNUM AS c2 FROM XMLTABLE ('1 to 10000');
CREATE TABLE t2 AS SELECT * FROM t1;
CREATE TABLE t3 AS SELECT * FROM t1;

CREATE UNIQUE INDEX t1_u1 ON t1 (c2);
CREATE UNIQUE INDEX t2_u1 ON t2 (c1);
CREATE UNIQUE INDEX t3_u1 ON t3 (c1);

CREATE OR REPLACE VIEW v1 AS SELECT * FROM t2;

์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” ํ…Œ์ด๋ธ”๊ณผ ๋ทฐ๋ฅผ ์กฐ์ธํ•œ๋‹ค. v1 ๋ทฐ๊ฐ€ ๋ณ‘ํ•ฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 2
SELECT *
  FROM t1 a, v1 b
 WHERE a.c2 = 1
   AND b.c1 = a.c1;

-----------------------------------------------------------------------------------
| Id  | Operation                    | Name  | Starts | E-Rows | A-Rows | Buffers |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |       |      1 |        |      1 |       6 |
|   1 |  NESTED LOOPS                |       |      1 |      1 |      1 |       6 |
|   2 |   TABLE ACCESS BY INDEX ROWID| T1    |      1 |      1 |      1 |       3 |
|*  3 |    INDEX UNIQUE SCAN         | T1_U1 |      1 |      1 |      1 |       2 |
|   4 |   TABLE ACCESS BY INDEX ROWID| T2    |      1 |      1 |      1 |       3 |
|*  5 |    INDEX UNIQUE SCAN         | T2_U1 |      1 |      1 |      1 |       2 |
-----------------------------------------------------------------------------------

์•„๋ž˜์™€ ๊ฐ™์ด ๋ทฐ์— ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ์™€ ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•œ ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

-- 3
CREATE OR REPLACE VIEW v1
AS
SELECT *
  FROM (SELECT a.c1
             , (SELECT x.c2 FROM t3 x WHERE x.c1 = a.c2) AS c2 --> ADD
          FROM t2 a)
 WHERE c2 = 1 --> ADD
;

์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด v1 ๋ทฐ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ 10,000๋ฒˆ ์ˆ˜ํ–‰๋˜์–ด ๋ธ”๋ก I/O๊ฐ€ 10,175๊ฐœ๋กœ ์ฆ๊ฐ€ํ–ˆ๋‹ค.

-- 4
SELECT /*+ MERGE(B) */
       *
  FROM t1 a, v1 b
 WHERE a.c2 = 1
   AND b.c1 = a.c1;

-----------------------------------------------------------------------------------
| Id  | Operation                    | Name  | Starts | E-Rows | A-Rows | Buffers |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |       |      1 |        |      1 |   10175 |
|   1 |  TABLE ACCESS BY INDEX ROWID | T3    |  10000 |      1 |  10000 |   10142 |
|*  2 |   INDEX UNIQUE SCAN          | T3_U1 |  10000 |      1 |  10000 |     142 |
|   3 |  NESTED LOOPS                |       |      1 |      1 |      1 |   10175 |
|   4 |   TABLE ACCESS BY INDEX ROWID| T1    |      1 |      1 |      1 |       3 |
|*  5 |    INDEX UNIQUE SCAN         | T1_U1 |      1 |      1 |      1 |       2 |
|*  6 |   VIEW                       |       |      1 |      1 |      1 |   10172 |
|   7 |    TABLE ACCESS FULL         | T2    |      1 |  10000 |  10000 |      30 |
-----------------------------------------------------------------------------------

ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ JPPD๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 5
SELECT /*+ LEADING(A) USE_NL(B) PUSH_PRED(B) */
       *
  FROM t1 a, v1 b
 WHERE a.c2 = 1
   AND b.c1 = a.c1;

-----------------------------------------------------------------------------------
| Id  | Operation                    | Name  | Starts | E-Rows | A-Rows | Buffers |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |       |      1 |        |      1 |   10175 |
|   1 |  TABLE ACCESS BY INDEX ROWID | T3    |  10000 |      1 |  10000 |   10142 |
|*  2 |   INDEX UNIQUE SCAN          | T3_U1 |  10000 |      1 |  10000 |     142 |
|   3 |  NESTED LOOPS                |       |      1 |      1 |      1 |   10175 |
|   4 |   TABLE ACCESS BY INDEX ROWID| T1    |      1 |      1 |      1 |       3 |
|*  5 |    INDEX UNIQUE SCAN         | T1_U1 |      1 |      1 |      1 |       2 |
|*  6 |   VIEW                       |       |      1 |      1 |      1 |   10172 |
|   7 |    TABLE ACCESS FULL         | T2    |      1 |  10000 |  10000 |      30 |
-----------------------------------------------------------------------------------

์กฐ์ธ์„ ์•„์šฐํ„ฐ ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด JPPD๊ฐ€ ๋™์ž‘ํ•˜์ง€๋งŒ, ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค์ˆ˜์ธ ๊ฒฝ์šฐ ๊ทผ๋ณธ์ ์ธ ํ•ด๋ฒ•์ด ๋  ์ˆ˜ ์—†๋‹ค.

-- 6
SELECT /*+ LEADING(A) USE_NL(B) PUSH_PRED(B) NO_OUTER_JOIN_TO_INNER */
       *
  FROM t1 a, v1 b
 WHERE a.c2 = 1
   AND b.c1(+) = a.c1
   AND b.c1 IS NOT NULL;

-------------------------------------------------------------------------------------
| Id  | Operation                      | Name  | Starts | E-Rows | A-Rows | Buffers |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |       |      1 |        |      1 |       9 |
|   1 |  TABLE ACCESS BY INDEX ROWID   | T3    |      1 |      1 |      1 |       3 |
|*  2 |   INDEX UNIQUE SCAN            | T3_U1 |      1 |      1 |      1 |       2 |
|*  3 |  FILTER                        |       |      1 |        |      1 |       9 |
|   4 |   NESTED LOOPS OUTER           |       |      1 |      1 |      1 |       9 |
|   5 |    TABLE ACCESS BY INDEX ROWID | T1    |      1 |      1 |      1 |       3 |
|*  6 |     INDEX UNIQUE SCAN          | T1_U1 |      1 |      1 |      1 |       2 |
|*  7 |    VIEW PUSHED PREDICATE       |       |      1 |      1 |      1 |       6 |
|   8 |     TABLE ACCESS BY INDEX ROWID| T2    |      1 |      1 |      1 |       3 |
|*  9 |      INDEX UNIQUE SCAN         | T2_U1 |      1 |      1 |      1 |       2 |
-------------------------------------------------------------------------------------

ํ•ด๋‹น ํ˜„์ƒ์€ ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. t3 ํ…Œ์ด๋ธ”์˜ c1 ์—ด์ด ๊ณ ์œ ํ•˜๋ฏ€๋กœ ๋ทฐ์˜ ์Šค์นผ๋ผ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 7
CREATE OR REPLACE VIEW v1
AS
SELECT a.c1, b.c2
  FROM t2 a, t3 b
 WHERE b.c1(+) = a.c2
   AND b.c2(+) = 1;

v1 ๋ทฐ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์–ด ๋ธ”๋ก I/O๊ฐ€ 9๊ฐœ๋กœ ๊ฐ์†Œํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

-- 8
SELECT *
  FROM t1 a, v1 b
 WHERE a.c2 = 1
   AND b.c1 = a.c1;

------------------------------------------------------------------------------------
| Id  | Operation                     | Name  | Starts | E-Rows | A-Rows | Buffers |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |       |      1 |        |      1 |       9 |
|   1 |  NESTED LOOPS OUTER           |       |      1 |      1 |      1 |       9 |
|   2 |   NESTED LOOPS                |       |      1 |      1 |      1 |       6 |
|   3 |    TABLE ACCESS BY INDEX ROWID| T1    |      1 |      1 |      1 |       3 |
|*  4 |     INDEX UNIQUE SCAN         | T1_U1 |      1 |      1 |      1 |       2 |
|   5 |    TABLE ACCESS BY INDEX ROWID| T2    |      1 |      1 |      1 |       3 |
|*  6 |     INDEX UNIQUE SCAN         | T2_U1 |      1 |      1 |      1 |       2 |
|*  7 |   TABLE ACCESS BY INDEX ROWID | T3    |      1 |      1 |      1 |       3 |
|*  8 |    INDEX UNIQUE SCAN          | T3_U1 |      1 |      1 |      1 |       2 |
------------------------------------------------------------------------------------


Posted by ์ •ํฌ๋ฝ_