Oracle Query - ynjch97/YNJCH_WIKI GitHub Wiki

1. Oracle Hint

  • /*+ [ํžŒํŠธ๋ช…] */ ์ด์™€ ๊ฐ™์ด ์‚ฌ์šฉ
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํžŒํŠธ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํžŒํŠธ ์‚ฌ์ด๋Š” SPACE(๊ณต๋ฐฑ)๋กœ ๊ตฌ๋ถ„
  • ๊ด„ํ˜ธ ์•ˆ์˜ ํ…Œ์ด๋ธ”์€ ALIAS(๋ณ„์นญ)๋กœ ์ •์˜ํ•˜๋ฉฐ, ๊ด„ํ˜ธ ์‚ฌ์ด์—๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„
  • ์˜ˆ: /*+ LEADING(A,B) USE_HASH(A,B) */

1-1. ์ตœ์ ํ™” Hint

  • /*+ ALL_LOWS */ : ์ „์ฒด ์ฒ˜๋ฆฌ์†๋„ ์ตœ์ ํ™”
  • /*+ FIRST_ROWS(N) */ : ์ตœ์ดˆ N๊ฑด ์‘๋‹ต์†๋„ ์ตœ์ ํ™”

1-2. ์—‘์„ธ์Šค ๋ฐฉ์‹์— ๋”ฐ๋ฅธ Hint

  • /*+ FULL */ : ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ…Œ์ด๋ธ” Full Scan ์ ‘๊ทผ
  • /*+ INDEX */ : ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋„๋ก ํ•จ
  • /*+ INDEX_DESC */ : ์ธ๋ฑ์Šค๋ฅผ ์—ญ์ˆœ์œผ๋กœ(ORDER BY DESC) ํƒ€๋„๋ก ํ•จ (์‹œ๊ฐ„ ์ˆœ์„œ๊ฐ€ ์ตœ๊ทผ์ธ ๊ฒƒ ๋˜๋Š” MAX๊ฐ’ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉ)
  • /*+ INDEX_FFS */ : INDEX FAST FULL SCAN
  • /*+ INDEX_SS */ : INDEX SKIP SCAN
  • /*+ INDEX_RS */ : INDEX RANGE SCAN

1-3. ์กฐ์ธ ์ˆœ์„œ์— ๋”ฐ๋ฅธ Hint

  • /*+ ORDERED */ : FROM์ ˆ์— ๋‚˜์—ด๋œ ํ…Œ์ด๋ธ” ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ
  • /*+ LEADING */ : ํžŒํŠธ์ ˆ์— ์—ด๊ฑฐํ•œ ํ…Œ์ด๋ธ” ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ (/*+ LEADING(A B C) */ : A B C ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ)
  • /*+ SWAP_JOIN_INPUTS */ : ํ•ด์‹œ์กฐ์ธ์˜ ๊ฒฝ์šฐ, BUILD INPUT๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ ( /*+ SWAP_JOIN_INPUTS(A) */, BUILD INPUT๊ณผ PROBE์— ๋Œ€ํ•œ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์Œ)

1-4. ์กฐ์ธ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ Hint

  • /*+ USE_NL */ : NL(NESTED LOOP - ์ค‘์ฒฉ๋ฃจํ”„)๋ฐฉ์‹ JOIN ์œ ๋„
  • /*+ USE_MERGE */ : SORT MERGE JOIN ์œ ๋„
  • /*+ USE_HASH */ : HASH JOIN ์œ ๋„
  • /*+ NL_SJ */ : NL SEMI JOIN ์œ ๋„
  • /*+ MERGE_SJ */ : SORT MERGE SEMI JOIN ์œ ๋„
  • /*+ HASH_SJ */ : HASH SEMI JOIN ์œ ๋„

1-5. ์ฟผ๋ฆฌ ๋ณ€ํ™˜ Hint

  • /*+ MEERGE */ : ๋ทฐ ๋จธ์ง• ์œ ๋„
  • /*+ NO_MERGE */ : ๋ทฐ ๋จธ์ง• ๋ฐฉ์ง€
  • /*+ PUSH_PRED */ : ์กฐ์ธ์กฐ๊ฑด PUSHDOWN ์œ ๋„
  • /*+ NO_PUSH_PRED */ : ์กฐ์ธ์กฐ๊ฑด PUSHDOWN ๋ฐฉ์ง€
  • /*+ USE_CONCAT */ : OR ๋˜๋Š” IN-LIST์กฐ๊ฑด์„ OR-EXPANSION์œผ๋กœ ์œ ๋„
  • /*+ NO_EXPAND */ : OR ๋˜๋Š” IN-LIST ์กฐ๊ฑด์— ๋Œ€ํ•œ OR-EXPANSION๋ฐฉ์ง€

1-6. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ Hint

  • /*+ PARALLEL */ : ํ…Œ์ด๋ธ” ์Šค์บ”, DML ๋ณ‘๋ ฌ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ (๋‹จ์ผ ๋Œ€ํ˜• ํ…Œ์ด๋ธ” ์ ‘๊ทผ ์‹œ ์‚ฌ์šฉ, /*+ PARALLEL(T1 4)*/)
  • /*+ PARALLEL_INDEX */ : ์ธ๋ฑ์Šค ์Šค์บ”์„ ๋ณ‘๋ ฌ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์œ ๋„
  • /*+ PQ_DISTRIBUTE */ : ๋ณ‘๋ ฌ ์ˆ˜ํ–‰ ์‹œ ๋ฐ์ดํ„ฐ ๋ถ„๋ฐฐ ๋ฐฉ์‹ ๊ฒฐ์ • (PQ_DISTRIBUTE(T1 HASH(--BUILD INPUT) HASH(--PROBE TABLE)))

1-7. ์„œ๋ธŒ์ฟผ๋ฆฌ ํŒฉํ† ๋ง Hint

  • /*+ MATERIALIZE */ : WITH๋ฌธ์œผ๋กœ ์ •์˜ํ•œ ์ง‘ํ•ฉ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์œ ๋„
  • /*+ INLINE */ : WITH๋ฌธ์œผ๋กœ ์ •์˜ํ•œ ์ง‘ํ•ฉ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€์•Š๊ณ  INLINE ์ฒ˜๋ฆฌํ•˜๋„๋ก ์œ ๋„
WITH /*+ MATERIALIZE */ T AS (SELECT ...)
WITH /*+ INLINE */ T AS (SELECT ...)

1-8. ์„œ๋ธŒ์ฟผ๋ฆฌ Hint

  • /*+ UNNEST */ : FILTER ๋™์ž‘ ๋ฐฉ์‹์ด ์•„๋‹Œ ์กฐ์ธ ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ์„œ๋ธŒ์ฟผ๋ฆฌ UNNESTING ์œ ๋„
  • /*+ NO_UNNEST */ : ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ FILTER ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ์„œ๋ธŒ์ฟผ๋ฆฌ UNNESTING ๋ฐฉ์ง€
  • /*+ NL_SJ */ : EXISTS or IN ์กฐ๊ฑด ์‚ฌ์šฉ ์‹œ ์„œ๋ธŒ์ฟผ๋ฆฌ์— UNNEST์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, NESTED LOOPS SEMI JOIN ์ฒ˜๋ฆฌ๋จ
  • /*+ HASH_SJ */ : EXISTS or IN ์กฐ๊ฑด ์‚ฌ์šฉ ์‹œ ์„œ๋ธŒ์ฟผ๋ฆฌ์— UNNEST์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, HASH SEMI JOIN ์ฒ˜๋ฆฌ๋จ (/*+ UNNEST HASH_AJ */)
  • /*+ NL_AJ */ : NOT EXISTS or NOT IN ์กฐ๊ฑด ์‚ฌ์šฉ ์‹œ ์„œ๋ธŒ์ฟผ๋ฆฌ์— UNNEST์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, NESTED LOOPS ANTI JOIN ์ฒ˜๋ฆฌ๋จ
  • /*+ HASH_AJ */ : NOT EXISTS or NOT IN ์กฐ๊ฑด ์‚ฌ์šฉ ์‹œ ์„œ๋ธŒ์ฟผ๋ฆฌ์— UNNEST์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, HASH ANTI JOIN ์ฒ˜๋ฆฌ๋จ
  • /*+ ORDERED */ : FROM ์ ˆ์— ๋‚˜์—ด๋œ ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ, ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜ํ–‰
  • /*+ QB_NAME */ : QUERY BLOCK์˜ ์ด๋ฆ„์„ ์ง€์ •
  • /*+ SWAP_JOIN_INPUTS */ : HASH JOIN ์‹œ ์กฐ์ธ ์ˆœ์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (๋ช…์‹œ๋œ ํ…Œ์ด๋ธ”์ด BUILD ํ…Œ์ด๋ธ”์ด ๋จ)
  • /*+ NO_SWAP_JOIN_INPUTS */ : HASH JOIN์‹œ ์กฐ์ธ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ๊ฐ•์ œ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ๋ชปํ•˜๋„๋ก ์ œ์–ด
  • /*+ PUSH_SUBQ */ : ์„œ๋ธŒ์ฟผ๋ฆฌ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ œ์–ด (FILTER๋กœ ์ˆ˜ํ–‰๋จ)
-- ์„œ๋ธŒ์ฟผ๋ฆฌ๋ถ€ํ„ฐ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์‹คํ–‰๊ณ„ํš ์ œ์–ด
-- ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์œผ๋ ค๋ฉด NO_SWAP_JOIN_INPUTS ์‚ฌ์šฉ
SELECT COL1, COL2, COL3
FROM TBL_T1 T1
WHERE COL1 >= :B1
AND EXISTS (
        SELECT /*+ UNNEST HASH_SJ SWAP_JOIN_INPUTS(T2)*/ 1 
        FROM TBL_T2 T2 
        WHERE T2.COL1 = T1.COL1
    )
;

1-9. INSERT, UPDATE, DELETE Hint

  • /*+ APPNED */ : INSERT ์†๋„ ํ–ฅ์ƒ
  • /*+ ENABLE_PARALLEL_DML PARALLEL(32) */ : UPDATE, DELETE ์†๋„ ํ–ฅ์ƒ