쿼리 해시를 사용하여 쿼리의 패턴과 추세 식별하기¶
쿼리 기록에서 유사한 쿼리를 식별, 그룹화, 분석하려면 쿼리 텍스트의 해시를 사용하면 됩니다. 예를 들어 다음을 할 수 있습니다.
쿼리 해시별로 쿼리를 그룹화하여 비용이 많이 드는 쿼리의 패턴을 식별합니다.
반복 쿼리에 대한 성능 개선(예: 클러스터링 키 변경) 효과를 확인합니다.
다음 뷰와 테이블 함수에서는 query_hash
및 query_parameterized_hash
열을 사용하여 쿼리 텍스트의 해시를 가져올 수 있습니다.
ACCOUNT_USAGE 뷰(1년 보존)
INFORMATION_SCHEMA 테이블 함수(7일 보존)
QUERY_HISTORY 테이블 함수
TASK_HISTORY 테이블 함수
이 해시를 사용하여 반복되는 쿼리를 분석할 수 있습니다.
쿼리 해시(query_hash
) 사용하기¶
query_hash
열에는 SQL 문의 표준화된 텍스트를 기반으로 계산된 해시 값이 포함됩니다. 정확히 동일한 쿼리 텍스트가 있는 반복 쿼리는 동일한 query_hash
값을 갖습니다.
쿼리 텍스트가 다음에서만 다른 경우 반복되는 쿼리에도 동일한 query_hash
가 있습니다.
대/소문자를 구분하지 않는 식별자, 세션 변수 및 스테이지 이름
여기에는 바인드 변수와 함께 IDENTIFIER()를 사용하여 지정된 식별자가 포함되지 않습니다. 다른 값을 가진 바인드 변수는 다른 쿼리 해시를 생성합니다.
공백
주석
두 쿼리의 쿼리 텍스트 중 다른 부분이 다른 경우 해당 쿼리는 서로 다른 query_hash
값을 가집니다.
예를 들어 다음 쿼리는 정확히 동일한 쿼리 텍스트를 가지므로 동일한 query_hash
값을 가집니다.
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'TIM'
query_hash
값을 사용하면 다른 방법으로는 명확하지 않을 수 있는 쿼리 성능의 패턴을 찾을 수 있습니다. 예를 들어 단일 실행 중에는 쿼리 비용이 과도할 정도로 들지 않을 수 있을지라도 쿼리가 자주 반복되면 실행 횟수에 따라 높은 비용 부담으로 이어질 수 있습니다. query_hash
값을 사용하여 먼저 최적화에 집중할 쿼리를 식별할 수 있습니다.
예를 들어 다음 쿼리는 query_hash
값을 사용하여 가장 오래 실행되는 쿼리 100개의 쿼리 ID를 식별합니다.
SELECT
query_hash,
COUNT(*),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WAREHOUSE'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
GROUP BY query_hash
ORDER BY SUM(total_elapsed_time) DESC
LIMIT 100;
매개 변수가 있는 쿼리의 해시(query_parameterized_hash
) 사용하기¶
query_parameterized_hash
는 매개 변수가 있는 쿼리를 기반으로 계산된 해시 값을 포함하는데, 이는 리터럴이 매개 변수로 지정된 후의 쿼리 버전을 의미합니다. 이러한 리터럴은 쿼리 조건자에 사용해야 하며 다음 비교 연산자 중 하나와 함께 사용해야 합니다.
=
(같음)!=
(같지 않음)>=
(크거나 같음)<=
(작거나 같음)
반복되는 쿼리(매개 변수 값이 다른 쿼리 포함)는 동일한 query_parameterized_hash
값을 가집니다.
쿼리 텍스트가 다음에서만 다른 경우 반복되는 쿼리에도 동일한 query_parameterized_hash
가 있습니다.
대/소문자를 구분하지 않는 식별자, 세션 변수 및 스테이지 이름
여기에는 바인드 변수와 함께 IDENTIFIER()를 사용하여 지정된 식별자가 포함되지 않습니다. 다른 값을 가진 바인드 변수는 다른 쿼리 해시를 생성합니다.
공백
주석
동일한 query_hash
값을 가진 쿼리는 query_parameterized_hash
값도 동일하지만, 그 반대는 아닙니다.
예를 들어, 다음 쿼리는 쿼리 간의 유일한 차이가 리터럴 값이므로 동일한 query_parameterized_hash
값을 가집니다.
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'AIHUA'
query_hash
값의 경우와 마찬가지로, query_parameterized_hash
값을 사용하면 다른 방법으로는 명확하지 않을 수 있는 쿼리 성능의 패턴을 찾을 수 있습니다.
다음 문은 특정 query_parameterized_hash
값(cbd58379a88c37ed6cc0ecfebb053b03
)이 있는 모든 쿼리에 대해 매일 평균 total_elapsed_time
을 계산합니다.
SELECT
DATE_TRUNC('day', start_time),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
GROUP BY DATE_TRUNC('day', start_time);
해시 생성에 사용된 버전 확인하기¶
시간이 지남에 따라, Snowflake에서 쿼리 해시 생성에 사용하는 논리가 변경될 수 있습니다. 이 논리를 변경하면 동일한 쿼리에 대해 서로 다른 해시가 생성될 수 있습니다. 예를 들어 주어진 쿼리에 대해 논리의 버전 1에서 생성된 해시는 논리의 버전 2에서 생성된 해시와 다를 수 있습니다.
query_hash
및 query_parameterized_hash
열을 포함하는 뷰 및 테이블 함수 출력에는 해시 생성에 사용되는 논리의 버전을 지정하는 다음 열도 포함됩니다.
query_hash_version
query_parameterized_hash_version
이들 열의 버전 번호는 NUMBER입니다(예: 논리의 첫 번째 버전은 1
, 논리의 두 번째 버전은 2
등).
이러한 열에 다양한 기간 동안 다양한 버전 번호가 포함된 경우 이러한 버전 열을 사용하여 동일한 쿼리에 대해 다른 해시를 식별할 수 있습니다. 예:
...
WHERE (query_hash = 'hash_from_v1' AND query_hash_version = 1)
OR (query_hash = 'hash_from_v2' AND query_hash_version = 2)