DB/etc

MSSQL OPTION(RECOMPILE)

sshhhh 2023. 10. 5. 16:27

 

πŸ“Œ SQL Server OPTION(RECOMPILE) 

βœ… OPTION(RECOMPILE)은 쿼리 μ‹€ν–‰ μ‹œλ§ˆλ‹€ μƒˆλ‘œμš΄ μ‹€ν–‰ κ³„νšμ„ μƒμ„±ν•˜λŠ” μ˜΅μ…˜
βœ… λ§€κ°œλ³€μˆ˜ 값이 자주 λ³€ν•˜κ±°λ‚˜, 동적 SQL을 μ‚¬μš©ν•  λ•Œ 졜적의 μ‹€ν–‰ κ³„νšμ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

βœ…  SQL Serverκ°€ 맀번 μ΅œμ‹ μ˜ ν…Œμ΄λΈ” 톡계 λ˜λŠ” 쑰인 쑰건과 같은 ν™˜κ²½ λ³€κ²½ 사항을 κ³ λ €ν•˜μ—¬ 졜적의 μ‹€ν–‰ κ³„νšμ„ 생성


βœ… μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

βœ”οΈ λ§€κ°œλ³€μˆ˜ 값이 자주 변경될 λ•Œ → νŠΉμ • 값에 μ΅œμ ν™”λ˜μ§€ μ•Šλ„λ‘ 방지
βœ”οΈ WHERE μ ˆμ΄λ‚˜ JOIN 쑰건이 λ™μ μœΌλ‘œ λ°”λ€” λ•Œ → μ‹€ν–‰ κ³„νšμ„ μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€
βœ”οΈ 쿼리 μ‹€ν–‰ μ„±λŠ₯이 μΌμ •ν•˜μ§€ μ•Šμ„ λ•Œ → μ΅œμ ν™”λœ μ‹€ν–‰ κ³„νšμ„ 적용


βœ… μ‚¬μš© 예제

SELECT * FROM Orders
WHERE OrderDate >= @StartDate
OPTION(RECOMPILE);

πŸ“Œ 맀번 졜적의 μ‹€ν–‰ κ³„νšμ„ μƒμ„±ν•˜μ—¬ μ„±λŠ₯ μœ μ§€


βœ… μ£Όμ˜ν•  점

⚠️ 쿼리 μ‹€ν–‰ μ‹œλ§ˆλ‹€ μ‹€ν–‰ κ³„νšμ„ μƒˆλ‘œ λ§Œλ“€κΈ° λ•Œλ¬Έμ—, μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯μ„± 있음
     (μ„±λŠ₯ μ΅œμ ν™”μ— 도움을 μ£Όμ§€λ§Œ 쿼리 μ‹€ν–‰ 속도λ₯Ό 늘릴 수 μžˆμœΌλ―€λ‘œ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©)

⚠️ 정적인 쿼리(자주 λ³€ν•˜μ§€ μ•ŠλŠ” λ§€κ°œλ³€μˆ˜)μ—λŠ” λΆˆν•„μš”

πŸ“Œ 즉, 동적 μΏΌλ¦¬λ‚˜ μ‹€ν–‰ κ³„νš μ΅œμ ν™”κ°€ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 효과적

 

 

βœ… 1. OPTION(RECOMPILE)μ΄λž€?

OPTION(RECOMPILE)은 SQL Serverμ—μ„œ 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μ‹€ν–‰ κ³„νšμ„ μž¬μ»΄νŒŒμΌν•˜λ„λ‘ μ§€μ‹œν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.
즉, 맀번 μ΅œμ‹ μ˜ ν…Œμ΄λΈ” 톡계 및 쑰건을 λ°˜μ˜ν•˜μ—¬ 졜적의 μ‹€ν–‰ κ³„νšμ„ μƒμ„±ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.


βœ… 2. OPTION(RECOMPILE)을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우

맀개 λ³€μˆ˜ 값이 자주 λ³€κ²½λ˜λŠ” 경우 μ‹€ν–‰ κ³„νšμ΄ νŠΉμ • 맀개 λ³€μˆ˜μ— μ΅œμ ν™”λ˜μ§€ μ•Šλ„λ‘ 방지
동적 SQLμ—μ„œ WHERE μ ˆμ΄λ‚˜ 쑰인 쑰건이 λ³€ν•˜λŠ” 경우 쑰건이 λ³€ν•  λ•Œλ§ˆλ‹€ 졜적의 μ‹€ν–‰ κ³„νšμ„ μƒˆλ‘œ 생성
λ³΅μž‘ν•œ μΏΌλ¦¬μ—μ„œ νŠΉμ • 상황별 졜적의 μ‹€ν–‰ κ³„νšμ΄ ν•„μš”ν•œ 경우 쿼리 쑰건에 따라 졜적의 μ‹€ν–‰ κ³„νšμ„ λ‹€λ₯΄κ²Œ 적용

 

πŸ“Œ 즉, OPTION(RECOMPILE)은 μ‹€ν–‰ κ³„νšμ„ κ³ μ •μ‹œν‚€μ§€ μ•Šκ³ , 맀번 졜적의 μƒνƒœλ‘œ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©


βœ… 3. OPTION(RECOMPILE) 예제

πŸ“Œ 맀개 λ³€μˆ˜ 값이 λ‹¬λΌμ§ˆ λ•Œλ§ˆλ‹€ 졜적의 μ‹€ν–‰ κ³„νšμ„ μƒμ„±ν•˜λŠ” 예제

SELECT * FROM Orders
WHERE OrderDate >= @StartDate
OPTION(RECOMPILE);

 

βœ… 이 경우 @StartDate 값이 변경될 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μ‹€ν–‰ κ³„νšμ„ μƒμ„±ν•˜μ—¬ μ΅œμ ν™”!


βœ… 4. OPTION(RECOMPILE을 μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점

βœ”οΈ 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μ‹€ν–‰ κ³„νšμ„ μž¬μ»΄νŒŒμΌν•˜λ―€λ‘œ μ„±λŠ₯에 영ν–₯을 쀄 수 있음
βœ”οΈ 정적인 쿼리(쿼리 ν…μŠ€νŠΈκ°€ κ³ μ •λ˜κ³  맀개 λ³€μˆ˜ 값이 거의 λ³€ν•˜μ§€ μ•ŠλŠ” 경우)μ—λŠ” λΆˆν•„μš”
βœ”οΈ λ°˜λ“œμ‹œ μ‹€ν–‰ κ³„νšμ„ λ™μ μœΌλ‘œ μ‘°μ •ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•΄μ•Ό 함


βœ… 5. OPTION(RECOMPILE)을 μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ” 경우

정적인 쿼리 λ™μΌν•œ μ‹€ν–‰ κ³„νšμ„ 반볡적으둜 μ‚¬μš©ν•  수 있음
자주 μ‹€ν–‰λ˜λŠ” 쿼리 맀번 μ‹€ν–‰ κ³„νšμ„ μƒˆλ‘œ μƒμ„±ν•˜λ©΄ 였히렀 μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯
맀개 λ³€μˆ˜ 값이 거의 λ³€ν•˜μ§€ μ•ŠλŠ” 경우 κΈ°μ‘΄ μ‹€ν–‰ κ³„νšμ„ μž¬μ‚¬μš©ν•˜λŠ” 것이 효율적

βœ… 6. κ²°λ‘ : μ–Έμ œ OPTION(RECOMPILE)을 μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

βœ”οΈ 맀개 λ³€μˆ˜ 값이 자주 λ³€ν•˜κ³ , 졜적의 μ‹€ν–‰ κ³„νšμ΄ 맀번 달라져야 ν•˜λŠ” 경우
βœ”οΈ 동적 SQL을 μ‚¬μš©ν•˜λ©° WHERE μ ˆμ΄λ‚˜ 쑰인 쑰건이 변경될 κ°€λŠ₯성이 높은 경우
βœ”οΈ νŠΉμ • μ‘°κ±΄μ—μ„œ μ΅œμ ν™”κ°€ ν•„μš”ν•œ 경우 (단, ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ μ‚¬μš©μ„ 지양해야 함)

πŸ“Œ 즉, μ‹€ν–‰ κ³„νšμ΄ κ³ μ •λ˜λ©΄ μ„±λŠ₯이 μ €ν•˜λ  κ°€λŠ₯성이 μžˆλŠ” κ²½μš°μ— OPTION(RECOMPILE)을 ν™œμš©ν•˜λ©΄ μ’‹λ‹€! πŸš€