제품 여행

[CUBRID] QUERY CACHE에 대해

by 김민종 posted Oct 29, 2021

QUERY CACHE에 대해 

큐브리드 11.0 버전이 출시되면서 QUERY CACHE 힌트를 지원하게 되었습니다.

이 글에서는 QUERY CACHE에 대해 알아보는 시간을 가져보겠습니다.

 

1. QUERY CACHE란?

  • Query Cache는 SELECT 쿼리문을 이용하여 조회한 값을 저장하고 있다가, 같은 쿼리 문을 요청하였을 때 미리 캐싱된 값을 반환하는 DBMS 기능입니다.
  • 자주 변경되지 않는 테이블이 있고 동일한 쿼리를 많이 받는 환경에서 매우 유용하게 사용될 수 있습니다. QUERY_CACHE 힌트를 사용한 쿼리는 전용 메모리 영역에 캐시되고 그 결과도 별도의 디스크 공간에 캐시됩니다. 

 

  • 쿼리 캐시 특징
    • 1. QUERY_CACHE 힌트는 SELECT 쿼리에만 적용됩니다.      
    • 2. 테이블에 변화(INSERT,UPDATE,DELETE)가 일어나게 되면 해당테이블과 관련된 Query Cache내의 정보들은 초기화 됩니다.
    • 3. DB를 내리면 Query Cache는 초기화 됩니다.
    • 4. max_query_cache_entries와 query_cache_size_in_pages 설정 값을 통해 캐시될 크기를 조절할 수 있습니다. (default 값은 모두 0 입니다.)
    •     max_query_cache_entries는 최대 캐시할 수 있는 질의 개수에 대한 설정 값으로 1이상으로 설정되면 설정된 수 만큼의 질의가 캐시됩니다.
    •     query_cache_size_in_pages는 최대 캐시할 수 있는 결과 페이지에 대한 설정 값으로 1이상으로 설정되면 설정된 페이지 만큼의 결과가 캐시됩니다.

 

  • QUERY CACHE의 장점

    • 요청으로 들어온 쿼리에 대해서 Query Cache에 존재하는 경우라면, 기존의 3단계(Parsing->Optimizing->Executing)를 거치지않고 바로 캐시에 담겨있는 데이터를 반환하게 됩니다. 따라서 쿼리의 비용이 크고, 반복적으로 호출되는 쿼리일수록 리소스 면에서 큰 이점을 얻을 수 있습니다.

2. 쿼리 캐시 사용 방법

  • 사용방법

    • 1. cubrid.conf 파일에 max_query_cache_entries 값과 query_cache_size_in_pages 값을 설정합니다.
        예를 들어, 캐시할 sql문 개수가 10개인 경우 max_query_cache_entries값을 10으로 설정하고, 결과크기가 10M일 경우에는 query_cache_size_in_pages를 640으로 설정합니다.

    • 2. select 문에 /*+ QUERY_CACHE */ 힌트를 추가합니다.

 

  • 처리 절차
          스크린샷 2021-10-29 오후 12.26.29.png

     

     

          1. 힌트가 설정된 SELECT 질의가 처리될 때 해당 질의가 캐시에서 발견되면 Query Cache를 사용합니다.
          2. 캐시된 질의를 찾을 수 없는 경우 질의가 처리된 다음 결과와 함께 캐시가 생성됩니다.

 

  • 처리 결과의 내용 분석
          CSQL에 세션 명령 ;info qcache 를 입력하여 쿼리가 캐시되는지 여부를 확인할 수 있습니다.
          예시) 

          info qcache.png

     

    캐시 된 질의는 결과 화면 중간에 query_string 으로 표시되며 각 n_entries 및 n_pages 는 캐시된 질의 수와 캐시 된 결과의 페이지 수를 나타냅니다.

    n_entries 는 파라미터 max_query_cache_entries 의 값으로 제한되고 n_pages는 query_cache_size_in_pages의 값으로 제한됩니다. n_entries가 초과되거나 n_pages가 초과되면 캐시 항목 중 일부가 삭제될 후보로 선택되어 삭제되고, 삭제되는 캐시는 max_query_cache_entries 값과 query_cache_size_in_pages 값의 약 20% 입니다.

3. 주의 사항

  • 아래와 같이 값이 계속적으로 변경되는 경우에는 쿼리에 힌트를 적용 할 수 없으며 힌트는 의미가 없어집니다.

          *질의에 시스템 시간 또는 날짜 관련 속성이 포함된 경우
              예) SELECT SYSDATE, ADDDATE (SYSDATE, INTERVAL -24 HOUR), ADDDATE (SYSDATE, -1);

          *SERIAL 관련 속성이 포함된 경우

          *컬럼 경로 관련 속성이 포함된 경우

          *메서드가 포함된 경우

          *저장 프로 시저 또는 저장 함수가 포함된 경우

          *dual, _db_attribute 등과 같은 시스템 테이블이 포함된 경우

          *sys_guid ()와 같은 시스템 함수가 포함된 경우

 

  • 테이블의 변경에 따른 lock 대기상황이 발생할 수도 있습니다.

    • 만약 대상 테이블에 대한 변경(ex. INSERT, UPDATE, DELETE)이 있었다면 항상 기존의 캐시를 제거합니다. 이 때 다른 트랜잭션에서는 이제 더이상 유효하지 않은 데이터를 가져가지 못하도록 lock을 걸게 됩니다. 이 lock이 풀릴때까지 Query Cache에 접근하는 트랜잭션들은 lock 상태에서 대기하게 됩니다. 따라서 테이블의 변경이 잦을수록, Query Cache를 사용하는 SELECT 쿼리가 많을수록 이 lock을 waiting하는 시간은 많은 비중을 차지하게 될 수도 있습니다.

4. 결론

  • Query Cache는 도로명 주소, 조직정보, 부서정보 등 자주 변경되지 않는 데이터, 자주 사용되는 데이터, 자주 같은 결과를 반환하는 데이터, 오래 걸리는 연산의 결과에 대해 사용하면 시스템 리소스 사용을 줄이고 성능향상을 기대해 볼 수 있습니다.