결과 집합 캐싱을 사용하도록 설정하면 전용 SQL 풀은 반복적인 사용을 위해 사용자 데이터베이스에 쿼리 결과를 자동으로 캐시합니다. 이렇게 하면 후속 쿼리 실행이 지속형 캐시에서 직접 결과를 가져올 수 있으므로 다시 계산이 필요하지 않습니다. 결과 집합 캐싱은 쿼리 성능을 향상시키고 컴퓨팅 리소스 사용량을 줄입니다. 또한 캐시된 결과 집합을 사용하는 쿼리는 동시성 슬롯을 사용하지 않으므로 기존 동시성 제한에 포함되지 않습니다. 보안을 위해 사용자는 캐시된 결과를 만드는 사용자와 동일한 데이터 액세스 권한이 있는 경우에만 캐시된 결과에 액세스할 수 있습니다. 결과 집합 캐싱은 기본적으로 데이터베이스 및 세션 수준에서 OFF입니다.
메모
결과 집합 캐싱은 DECRYPTBYKEY와 함께 사용하면 안 됩니다. 이 암호화 함수를 사용해야 하는 경우 실행 시 결과 집합 캐싱을 사용하지 않도록 설정(세션 수준 또는 데이터베이스 수준에서)해야 합니다.
키 명령
사용자 데이터베이스에 대한 결과 집합 캐싱을 켜기/끄기
캐시되지 않은 내용
데이터베이스에 대해 결과 집합 캐싱이 켜지면 다음 쿼리를 제외하고 캐시가 가득 찰 때까지 모든 쿼리에 대해 결과가 캐시됩니다.
- 기본 테이블의 데이터 또는 쿼리가 변경되지 않은 경우에도 비결정적인 기본 제공 함수 또는 런타임 식이 있는 쿼리입니다. 예를 들어 DateTime.Now(), GetDate()입니다.
- 사용자 정의 함수를 사용하는 쿼리
- 행 수준 보안이 있는 테이블을 사용하는 쿼리
- 행 크기가 64KB보다 큰 데이터를 반환하는 쿼리
- 큰 데이터 크기(>10GB)를 반환하는 쿼리
메모
- 일부 비결정적 함수 및 런타임 식은 동일한 데이터에 대한 반복 쿼리에 대해 결정적일 수 있습니다. 예를 들어 ROW_NUMBER()입니다.
- 쿼리 결과 집합의 행 순서/시퀀스가 애플리케이션 논리에 중요한 경우 쿼리에서 ORDER BY를 사용합니다.
- ORDER BY 열의 데이터가 고유하지 않은 경우 결과 집합 캐싱을 사용하거나 사용하지 않도록 설정했는지에 관계없이 ORDER BY 열에 동일한 값을 가진 행의 행 순서가 보장되지 않습니다.
중요합니다
결과 집합 캐시를 만들고 캐시에서 데이터를 검색하는 작업은 전용 SQL 풀 인스턴스의 제어 노드에서 수행됩니다. 결과 집합 캐싱이 켜지면 큰 결과 집합(예 >: 1GB)을 반환하는 쿼리를 실행하면 컨트롤 노드에서 높은 제한이 발생하고 인스턴스의 전체 쿼리 응답 속도가 느려질 수 있습니다. 이러한 쿼리는 일반적으로 데이터 탐색 또는 ETL 작업 중에 사용됩니다. 컨트롤 노드의 스트레스를 방지하고 성능 문제가 발생하는 것을 방지하려면 사용자는 해당 유형의 쿼리를 실행하기 전에 데이터베이스에서 결과 집합 캐싱을 해제해야 합니다.
쿼리에 대한 결과 집합 캐싱 작업에서 소요된 시간에 대해 이 쿼리를 실행합니다.
SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id = <'request_id'>;
다음은 결과 집합 캐싱을 사용하지 않도록 설정된 상태로 실행된 쿼리에 대한 예제 출력입니다.
다음은 결과 집합 캐싱을 사용하도록 설정된 상태로 실행된 쿼리에 대한 예제 출력입니다.
캐시된 결과가 사용되는 경우
다음 요구 사항이 모두 충족되면 캐시된 결과 집합이 쿼리에 다시 사용됩니다.
- 쿼리를 실행하는 사용자는 쿼리에서 참조되는 모든 테이블에 액세스할 수 있습니다.
- 새 쿼리와 결과 집합 캐시를 생성한 이전 쿼리 사이에는 정확히 일치하는 항목이 있습니다.
- 캐시된 결과 집합이 생성된 테이블에는 데이터 또는 스키마 변경 내용이 없습니다.
이 명령을 실행하여 결과 캐시 적중 또는 누락으로 쿼리가 실행되었는지 확인합니다. result_cache_hit 열은 결과 집합 캐싱이 사용되지 않은 이유로 캐시 적중 1, 캐시 누락의 경우 0, 음수 값을 반환합니다. 자세한 내용은 sys.dm_pdw_exec_requests 확인해 보세요.
SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>
캐시된 결과 관리
결과 집합 캐시의 최대 크기는 데이터베이스당 1TB입니다. 캐시된 결과는 기본 쿼리 데이터가 변경되면 자동으로 무효화됩니다.
캐시 제거는 다음 일정에 따라 전용 SQL 풀에서 자동으로 관리됩니다.
- 결과 집합이 사용되지 않았거나 무효화된 경우 48시간마다.
- 결과 집합 캐시가 최대 크기에 가까워지면
사용자는 다음 옵션 중 하나를 사용하여 전체 결과 집합 캐시를 수동으로 비울 수 있습니다.
- 데이터베이스에 대한 결과 집합 캐시 기능 끄기
- 데이터베이스에 연결된 상태에서 DBCC DROPRESULTSETCACHE 실행
데이터베이스를 일시 중지해도 캐시된 결과 집합은 비어 있지 않습니다.
다음 단계
더 많은 개발 팁은 개발 개요를 참조하세요.