πŸ›’οΈDatabase

μ˜΅ν‹°λ§ˆμ΄μ € νžŒνŠΈμ— λŒ€ν•΄μ„œ

DevPoong 2025. 1. 9. 13:36

νšŒμ‚¬μ—μ„œ κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄μ„œ μ˜΅ν‹°λ§ˆμ΄μ €κ°€ 졜적이라고 μƒκ°ν•˜λŠ” μ‹€ν–‰ κ³„νšκ³Ό μ‹€μ œ 졜적의 μ‹€ν–‰ κ³„νšμ€ μ’…μ’… 차이가 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.

μ΄λ•Œ, λ‚΄κ°€ μ§„ν–‰ν–ˆλ˜ κ°œμ„  λ°©ν–₯은 

  1. ν•΄λ‹Ή ν…Œμ΄λΈ”μ— λŒ€ν•΄ 이미 μ‘΄μž¬ν•˜λŠ” λ‹€λ₯Έ 인덱슀둜 λ³€κ²½ν•˜μ—¬ κ°œμ„  κ°€λŠ₯ν•œκ°€?
  2. 인덱슀λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μƒˆλ‘œ μΆ”κ°€ν•˜μ—¬ κ°œμ„  κ°€λŠ₯ν•œκ°€?

 

1번으둜 ν•΄κ²° κ°€λŠ₯ν•œ 뢀뢄은 SQL에 μ•‘μ„ΈμŠ€ λ°©μ‹μ΄λ‚˜ 쑰인 μˆœμ„œ, 쑰인 방식 λŒ€ν•œ Hintλ₯Ό μΆ”κ°€ν•˜μ—¬ κ°œμ„ μ„ μ§„ν–‰ν–ˆκ³ ,
1번으둜 해결이 λΆˆκ°€λŠ₯ν•œ 경우 즉, 2번의 κ²½μš°μ—λŠ” 인덱슀의 μˆœμ„œλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ ꡬ성 μ»¬λŸΌμ„ λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ μ§„ν–‰ν–ˆλ‹€.

 

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” 1번의 μΌ€μ΄μŠ€μ— μ μš©ν•œ μ˜΅ν‹°λ§ˆμ΄μ € νžŒνŠΈμ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ μ •λ¦¬ν•˜κ³ μž ν•œλ‹€.

 

μ˜΅ν‹°λ§ˆμ΄μ € Hint

였브젝트 톡계와 μ‹œμŠ€ν…œ 톡계 정보λ₯Ό λ°”νƒ•μœΌλ‘œ 졜적의 ν”„λ‘œμ‹œμ €λ₯Ό λ§Œλ“œλŠ” μ˜΅ν‹°λ§ˆμ΄μ €λ„ λ•Œλ•Œλ‘œ λ³΅μž‘ν•œ κ²½μš°μ—λŠ” ν•œκ³„κ°€ λ°œμƒν•œλ‹€.

 

μ΄λŸ¬ν•œ κ²½μš°μ— 직접 SQL에 효율적인 κ²½λ‘œμ— λŒ€ν•œ Hintλ₯Ό λΆ€μ—¬ν•¨μœΌλ‘œμ¨ κ°œμ„ ν•  수 μžˆλ‹€.

 

μ•„λž˜λŠ” A ν…Œμ΄λΈ”μ— λŒ€ν•΄μ„œ IDX_01λΌλŠ” 인덱슀둜 μ•‘μ„ΈμŠ€ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” 힌트λ₯Ό μ μš©ν•œ μ˜ˆμ‹œμ΄λ‹€.

SELECT /*+ INDEX(A, IDX_01) */
   x, y, z
FROM A
WHERE A.id = '000001'

 

Hint μ‚¬μš© μ£Όμ˜μ‚¬ν•­

힌트λ₯Ό μ‚¬μš©ν•  λ–„λŠ” μ£Όμ˜ν•  사항이 μžˆλ‹€.

 

첫째둜, νžŒνŠΈμ™€ 힌트 μ‚¬μ΄μ—λŠ” 콀마(,)λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆ λœλ‹€.

λΆ€μ μ ˆν•œ μΌ€μ΄μŠ€
/* INDEX(A), FULL(B) */   

μ μ ˆν•œ μΌ€μ΄μŠ€
/* INDEX(A) FULL(B) */

 

λ‘˜μ§Έλ‘œ, ν…Œμ΄λΈ”μ„ 지정할 λ•Œ, μŠ€ν‚€λ§ˆλͺ…κΉŒμ§€ λͺ…μ‹œν•˜λ©΄ μ•ˆ λœλ‹€.

λΆ€μ μ ˆν•œ 경우
SELECT /*+ FULL(KHS.A) */

μ μ ˆν•œ 경우
SELECT /*+ FULL(A) */

 

μ…‹μ§Έλ‘œ, FROM 절 ν…Œμ΄λΈ”λͺ…에 Aliasλ₯Ό μ§€μ •ν–ˆλ‹€λ©΄, νžŒνŠΈμ—λ„ Aliasλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

λΆ€μ μ ˆν•œ 경우
SELECT /*+ FULL(TAB1) */
FROM TAB1 A

μ μ ˆν•œ 경우
SELECT /*+ FULL(A) */
FROM TAB1 A

 

μ˜΅ν‹°λ§ˆμ΄μ € 반자율

힌트λ₯Ό μ μš©ν• κ²½μš°, νŠΉμ • ν…Œμ΄λΈ”μ— λŒ€ν•΄ μ•‘μ„ΈμŠ€ λ°©μ‹λ§Œ 힌트λ₯Ό μ£Όκ³  λ‚˜λ¨Έμ§€λŠ” μ˜΅ν‹°λ§ˆμ΄μ €μ—κ²Œ λ§‘κΈ°λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

 

μ•„λž˜μ˜ SQL의 경우 a ν…Œμ΄λΈ”μ„ μ•‘μ„ΈμŠ€ν•  λ•Œ IDX_dtλΌλŠ” μΈλ±μŠ€μ— μ ‘κ·Όν•˜λ„λ‘λ§Œ 힌트λ₯Ό λͺ…μ‹œν•˜κ³ ,
쑰인 방식과 μˆœμ„œ 그리고 B ν…Œμ΄λΈ”μ— λŒ€ν•œ μ•‘μ„ΈμŠ€ 방식은 μ˜΅ν‹°λ§ˆμ΄μ €κ°€ νŒλ‹¨ν•˜λ„λ‘ 맑겼닀.

SELECT /*+ INDEX(a, IDX_dt) */
    x, y, z
FROM A a, B b
WHERE a.dt =: dt
  AND a.id = b.id

 

 

μ΄λ²ˆμ—λŠ” SQL에 μ˜΅ν‹°λ§ˆμ΄μ €κ°€ λ‹€λ₯Έ 방식을 μ„ νƒν•˜μ§€ λͺ»ν•˜λ„둝 힌트λ₯Ό λΉˆν‹ˆμ—†μ΄ κ³ μ •ν•œ μΌ€μ΄μŠ€μ΄λ‹€.

SELECT /*+ LEADING(A) USE_NL(B) INDEX(a, IDX_dt) INDEX(b, IDX_id) */
    x, y, z
FROM A a, B b
WHERE a.dt =: dt
  AND a.id = b.id

 

 

톡계 μ •λ³΄λ‚˜ μ‹€ν–‰ ν™˜κ²½μ˜ λ³€ν™”λ‘œ μΈν•΄μ„œ μ˜΅ν‹°λ§ˆμ΄μ €κ°€ 졜적의 경둜λ₯Ό 찾지 λͺ»ν•  경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ 이미 힌트 μ μš©μ„ μ‹œμž‘ν–ˆλ‹€λ©΄ λΉˆν‹ˆμ—†μ΄ μ„€μ •ν•˜λŠ” 것이 쒋은 λ°©ν–₯이라고 μƒκ°ν•œλ‹€.

 

 

μ—¬κΈ°μ„œ λͺ¨λ‘ κΈ°μˆ ν•˜μ§€λŠ” μ•Šμ„ κ²ƒμ΄μ§€λ§Œ λ‹€λ₯Έ 힌트 μ’…λ₯˜λ₯Ό μ–ΈκΈ‰λ§Œ ν•˜κ³  λ§ˆλ¬΄λ¦¬ν•˜κ³ μž ν•œλ‹€.

  • μ•‘μ„ΈμŠ€ 방식 : FULL, INDEX, INDEX_DESC ...
  • 쑰인 μˆœμ„œ : ORDERD, LEADING...
  • 쑰인 방식 : USE_NL, USE_MERGER, USE_HASH, NL_SG, MERGER_SJ, HASH_SJ

λ‹€λ₯Έ 쿼리 λ³€ν™˜, 병렬 처리 등등을 μœ„ν•œ νžŒνŠΈλ„ μ‘΄μž¬ν•˜μ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” μ•‘μ„ΈμŠ€ 방식, 쑰인 μˆœμ„œ, 쑰인 λ°©μ‹μ—λ§Œ μ§‘μ€‘ν•˜κ³ μž ν•œλ‹€.