몇일전 질문하고 반대로 ^^
실행한 sql 결과가 버퍼에 오래동안 남게 하는 방법이 있을까요?
/*+ CACHE */ 이 힌트를 사용하면 오래 남나요?
뭐가 있을까요? ^^
문서에도 그렇게 나와있구요
실제로 autotrace를 뜨면서 테스트해보면 그렇긴 합니다.
그런데 실전에서 제가 직접 체감해본적은 없습니다.(기대하고 적용한 적이 있지만 그렇게 마음먹은대로 되지는 않더라구요... 아마 다른 요인으로 db-buffer-cache가 자꾸 비워졌으리라 추측합니다.)
그래서 사실 저도 그 힌트가 실효성이 있는지 궁금합니다.
다른 분들 중에서 효과를 맛보신 적이 있으신지 궁금합니다...
그리고 혹시 님께서 하시려는 것이 자주 사용하는 쿼리의 성능 향상이면 result-cache도 검색해보십시오...
네 맞습니다. 그 힌트 사용하면 캐시에 더 오래 남죠.
보통 Full scan 하면 LRU의 끝에 위치하기 때문에 잠시 후 Buffer cache에서 밀려납니다.
하지만 cache 힌트는 주의해서 사용하셔야 합니다. 잘못하면 버퍼캐시 효율에 엄청난 영향을 줄 수도 있어요. 예를 들어 대량의 블록을 액세스하는 쿼리에 cache 힌트를 쓰게 되면 버퍼 캐시에 캐싱된 블록 중에 엉뚱한 블록들이 피해를 입을 수 있습니다.
요즘은 cache 힌트보다는 keep pool을 사용하는 추세인 것 같습니다.
오라클 매뉴얼에는 이렇게 나와있습니다.
CACHE 힌트를 쓰면 버퍼 캐시의 LRU 리스트의 핫 영역에 위치되도록 한다. (즉, 바로 버퍼캐시에서 밀려나는게 아니라 천천히 밀려납니다)
You can use the CACHE and NOCACHE hints to indicate where the retrieved blocks are placed in the buffer cache. The CACHE hint instructs the optimizer to place the retrieved blocks at the most recently used end of the LRU list in the buffer cache when the database performs a full table scan.
CACHE
NOCACHE