적용 대상: Microsoft Fabric의 SQL Server 2022(16.x) 이상 버전
Azure SQL Database
Azure SQL Managed Instance
SQL 데이터베이스
이 문서에서는 쿼리 저장소 힌트를 사용하기 위한 모범 사례를 자세히 설명합니다. 쿼리 저장소 힌트를 사용하면 애플리케이션 코드를 수정하지 않고 쿼리 계획 셰이프를 셰이핑할 수 있습니다.
- 쿼리 저장소를 구성하고 관리하는 방법에 대한 자세한 내용은 쿼리 저장소를 사용하여 성능 모니터링을 참조하세요.
- 실행 가능한 정보를 검색하고 쿼리 저장소 사용하여 성능을 조정하는 방법에 대한 자세한 내용은 쿼리 저장소를 사용하여 성능 조정을 참조하세요.
- 쿼리 저장소에 대한 일반적인 모범 사례는 쿼리 저장소의 모범 사례를 참조하세요.
쿼리 저장소 힌트에 대한 사용 사례
다음 사용 사례는 쿼리 저장소 힌트에 적합합니다. 자세한 내용은 쿼리 저장소 힌트를 사용하는 경우를 참조하세요.
주의
SQL Server 쿼리 최적화 프로그램은 일반적으로 쿼리에 대해 최적의 실행 계획을 선택하므로 힌트는 숙련된 개발자나 데이터베이스 관리자가 최후의 수단으로만 사용하는 것이 좋습니다. 자세한 내용은 쿼리 힌트를 참조하세요.
코드를 변경할 수 없는 경우
쿼리 저장소 힌트를 사용하면 애플리케이션 코드 또는 데이터베이스 개체를 변경하지 않고 쿼리의 실행 계획에 영향을 줄 수 있습니다. 쿼리 힌트를 빠르고 쉽게 적용할 수 있는 다른 기능은 없습니다.
예를 들어 쿼리 저장소 힌트를 사용하여 코드를 다시 배포하지 않고 ETL에 이점을 얻을 수 있습니다. 이 14분 분량의 비디오를 통해 쿼리 저장소 힌트를 사용하여 대량 로드를 개선하는 방법을 알아봅니다.
쿼리 저장소 힌트는 간단한 쿼리 튜닝 메서드이지만 쿼리가 문제가 되면 보다 실질적인 코드 변경으로 해결해야 합니다. 쿼리에 정기적으로 쿼리 저장소 힌트를 적용할 필요성을 찾는 경우 더 큰 쿼리를 다시 작성하는 것이 좋습니다. SQL Server 쿼리 최적화 프로그램은 일반적으로 쿼리에 가장 적합한 실행 계획을 선택합니다. 숙련된 개발자 및 데이터베이스 관리자를 위한 최후의 수단으로 힌트만 사용하는 것이 좋습니다.
어떤 쿼리 힌트를 적용할 수 있는지에 대한 자세한 내용은 지원되는 쿼리 힌트를 참조하세요.
높은 트랜잭션 부하 또는 미션 크리티컬 코드와 함께 사용될 때
가동 시간 요구 사항 또는 트랜잭션 부하로 인해 코드 변경이 비현실적인 경우 쿼리 저장소 힌트는 기존 쿼리 워크로드에 쿼리 힌트를 신속하게 적용할 수 있습니다. 쿼리 저장소 힌트를 추가하고 제거하는 것은 쉽습니다.
쿼리 저장소 힌트를 쿼리 일괄 처리에 추가하거나 제거하여 갑작스러운 고부하 작업이 있을 때 성능을 조정할 수 있는 시간대를 설정할 수 있습니다.
계획 가이드를 대체합니다.
쿼리 저장소 힌트 이전에는 개발자가 계획 지침에 의존하여 사용하기 복잡할 수 있는 유사한 작업을 수행해야 했습니다. 쿼리 저장소 힌트는 쿼리의 시각적 탐색을 위해 SQL Server Management Studio(SSMS)의 쿼리 저장소 기능과 통합됩니다.
계획 가이드를 사용하면 쿼리 스니펫을 사용하여 모든 계획을 검색하는 것이 필요합니다. 쿼리 저장소 힌트 기능은 결과 쿼리 계획에 영향을 주기 위해 정확히 일치하는 쿼리가 필요하지 않습니다. 쿼리 저장소 힌트는 쿼리 저장소 데이터 세트의 query_id
에 적용할 수 있습니다.
쿼리 저장소 힌트는 하드 코드된 문 수준의 힌트와 기존 계획 지침을 재정의합니다.
최신 호환성 수준 고려
쿼리 저장소 힌트는 공급업체 사양 또는 더 큰 테스트 지연으로 인해 최신 데이터베이스 호환성 수준을 사용할 수 없는 경우 유용한 방법이 될 수 있습니다. 데이터베이스에서 개별 쿼리의 더 높은 호환성 수준을 사용할 수 있는 경우 SQL Server의 최신 성능 최적화 및 기능을 활용하도록 데이터베이스 호환성 수준을 업그레이드하는 것이 좋습니다.
예를 들어 호환성 수준이 140인 데이터베이스가 포함된 SQL Server 2022(16.x) 인스턴스가 있는 경우에도 쿼리 저장소 힌트를 사용하여 호환성 수준 160에서 개별 쿼리를 실행할 수 있습니다. 다음 힌트를 사용할 수 있습니다.
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';
전체 자습서는 쿼리 저장소 힌트 예제를 참조하세요.
업그레이드 후 이전 호환성 수준 고려
쿼리 저장소 힌트가 도움이 될 수 있는 또 다른 경우는 SQL Server 인스턴스 마이그레이션 또는 업그레이드 후에 쿼리를 직접 수정할 수 없는 경우입니다. 쿼리 저장소 힌트를 사용하여 쿼리를 다시 작성하거나 최신 호환성 수준에서 정상적인 성능을 발휘하도록 주소를 지정할 수 있을 때까지 쿼리에 대한 이전 호환성 수준을 적용합니다. 더 높은 호환성 수준으로 회귀된 이상값 쿼리를 식별하려면 쿼리 저장소의 회귀 쿼리 보고서, 마이그레이션 중 쿼리 튜닝 관리자 도구 또는 기타 쿼리 수준 애플리케이션 원격 분석을 사용하세요. 호환성 수준 간의 차이점에 대한 자세한 내용은 호환성 수준 간의 차이점을 참조하세요.
새 호환성 수준을 성능 테스트하고 이러한 방식으로 쿼리 저장소 힌트를 배포한 후에는 코드 변경 없이 문제가 있는 주요 쿼리를 이전 호환성 수준으로 유지하면서 전체 데이터베이스의 호환성 수준을 업그레이드할 수 있습니다.
문제가 있는 쿼리의 향후 실행 차단
쿼리 힌트를 ABORT_QUERY_EXECUTION
사용하여 알려진 문제가 있는 쿼리의 향후 실행을 차단할 수 있습니다( 예: 리소스 사용량이 높고 중요한 애플리케이션 워크로드에 영향을 미치는 비일상 쿼리).
비고
현재 ABORT_QUERY_EXECUTION (미리 보기) 쿼리 힌트는 Azure SQL Database 및 SQL Server 2025(17.x) 미리 보기에서만 사용할 수 있습니다.
예를 들어 향후 39의 query_id
실행을 차단하려면 다음 문을 실행합니다.
EXEC sys.sp_query_store_set_hints
@query_id = 39,
@query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';
자세한 내용은 쿼리 저장소 힌트 예제를 참조하세요.
고려 사항은 다음과 같습니다.
- 쿼리에 대해 이 힌트를 지정하면 오류 8778, 심각도 16으로 쿼리 실행 시도가 실패하고 ABORT_QUERY_EXECUTION 힌트가 지정되어 쿼리 실행이 중단되었습니다.
- 쿼리 차단을 해제하려면
query_id
저장 프로시저의@query_id
매개 변수에 값을 전달하여 힌트를 지울 수 있습니다. - 다음 예제 쿼리와 같이 시스템 보기를 사용하여 차단된 쿼리 저장소에서 쿼리를 찾을 수 있습니다.
SELECT qsh.query_id, q.query_hash, qt.query_sql_text FROM sys.query_store_query_hints AS qsh INNER JOIN sys.query_store_query AS q ON qsh.query_id = q.query_id INNER JOIN sys.query_store_query_text AS qt ON q.query_text_id = qt.query_text_id WHERE UPPER(qsh.query_hint_text) LIKE '%ABORT[_]QUERY[_]EXECUTION%'
- 값을 얻으려면
query_id
쿼리 저장소에 하나 이상의 쿼리 실행을 기록해야 합니다. 이 실행은 성공할 필요가 없습니다. 즉, 시간이 초과되거나 취소된 쿼리의 향후 실행이 차단될 수 있습니다. - 쿼리를 차단할 때 쿼리가 이미 실행 중인 경우 해당 실행이 계속됩니다.
KILL 문을 사용하여 쿼리를 중단할 수 있습니다.
- 종료된 쿼리의 실행은 쿼리 저장소에 기록되지 않습니다. 쿼리가 아직 쿼리 저장소에 없는 경우 쿼리를 완료하거나 차단할 수 있는 쿼리를
query_id
가져오기 위해 시간이 초과되도록 해야 합니다.
- 종료된 쿼리의 실행은 쿼리 저장소에 기록되지 않습니다. 쿼리가 아직 쿼리 저장소에 없는 경우 쿼리를 완료하거나 차단할 수 있는 쿼리를
- 힌트
ABORT_QUERY_EXECUTION
에 의해execution_type
쿼리가 차단되면execution_type_desc
보기의 열과 열이 각각 4와 예외로 설정됩니다. - 모든 쿼리 저장소 힌트와 마찬가지로
ALTER
힌트를 설정하고 지우려면 데이터베이스에 대한ABORT_QUERY_EXECUTION
권한이 있어야 합니다.
쿼리 저장소 힌트에 대한 고려 사항
쿼리 저장소 힌트를 배포할 때 다음 시나리오를 고려합니다.
데이터 배포 변경 내용
계획 가이드, 쿼리 저장소를 활용한 계획 강제 적용 및 쿼리 저장소 힌트는 최적화 프로그램의 의사 결정을 재정의합니다. 쿼리 저장소 힌트는 지금 도움이 될 수 있지만 미래에는 도움이 되지 않습니다. 예를 들어 쿼리 저장소 힌트가 이전 데이터 배포의 쿼리에 도움이 되는 경우 대규모 DML 작업에서 데이터를 변경하면 비생산적일 수 있습니다. 새 데이터 배포로 인해 최적화 프로그램이 힌트보다 더 나은 결정을 내릴 수 있습니다. 이 시나리오는 강제 적용 계획 동작의 가장 일반적인 결과입니다.
정기적으로 쿼리 저장소 힌트 전략을 다시 평가합니다.
다음과 같은 경우 기존 쿼리 저장소 힌트 전략을 다시 평가합니다.
- 알려진 대규모 데이터 분포 변경 후에
- 데이터베이스에 사용할 수 있는 리소스가 변경되는 경우 예를 들어 Azure SQL Database, SQL Managed Instance 또는 SQL Server 가상 머신의 컴퓨팅 크기가 변경되는 경우입니다.
- 계획 수정이 오래 지속되는 경우 쿼리 저장소 힌트는 단기 수정에 가장 적합합니다.
- 예기치 않은 성능 회귀
광범위한 영향 가능성
쿼리 저장소 힌트는 매개 변수 집합, 원본 애플리케이션, 사용자 또는 결과 집합에 관계없이 쿼리의 모든 실행에 영향을 줍니다. 실수로 성능이 저하되는 경우 sys.sp_query_store_set_hints로 만든 쿼리 저장소 힌트를 sys.sp_query_store_clear_hints로 쉽게 제거할 수 있습니다.
프로덕션 환경에서 쿼리 저장소 힌트를 적용하기 전에 중요한 업무용 또는 중요한 시스템에 대한 테스트 변경 내용을 신중하게 로드합니다.
강제 매개 변수화 및 RECOMPILE 힌트는 지원되지 않습니다.
데이터베이스 옵션 RECOMPILE
경우 쿼리 저장소 힌트와 함께 쿼리 힌트를 적용하는 것은 지원되지 않습니다. 자세한 내용은 강제 매개 변수화 사용 지침을 참조하세요.
힌트는 RECOMPILE
데이터베이스 수준에서 설정된 강제 매개 변수화와 호환되지 않습니다. 데이터베이스가 강제 매개 변수화를 RECOMPILE
사용하고 힌트가 쿼리를 위해 쿼리 저장소에 설정된 힌트 문자열의 일부인 경우 데이터베이스 엔진은 힌트를 RECOMPILE
무시하고 지정된 경우 다른 힌트를 적용합니다. 또한, 2022년 7월부터 Azure SQL Database에서 경고(오류 코드 12461)가 발생하며, 여기에는 RECOMPILE
힌트가 무시되었다는 내용이 포함되어 있습니다.
어떤 쿼리 힌트를 적용할 수 있는지에 대한 자세한 내용은 지원되는 쿼리 힌트를 참조하세요.