실행 시간 탐색하기¶
이 항목에서는 쿼리 및 작업 의 과거 성능을 검사하는 방법을 설명합니다. 이 정보는 성능 최적화 후보를 식별하는 데 도움이 되며 이를 통해 최적화 전략으로 원하는 효과를 거둘 수 있는지 확인할 수 있습니다.
Snowsight 를 사용하거나 ACCOUNT_USAGE 스키마의 뷰에 대한 쿼리를 작성하여 과거의 성능 기록을 탐색할 수 있습니다. ACCOUNT_USAGE 스키마에 대한 액세스 권한이 없는 사용자는 Information Schema를 사용하여 유사한 데이터를 쿼리할 수 있습니다.
실행 시간 및 로드 보기¶
Snowsight 를 사용하여 쿼리 및 작업의 성능뿐 아니라 웨어하우스 로드에 대한 시각적 인사이트를 얻을 수 있습니다.
- 쿼리:
Snowsight 에 로그인합니다.
Monitoring » Query History 를 선택합니다.
쿼리 실행에 걸린 시간을 이해하려면 Duration 열을 사용하십시오. 열을 정렬하여 가장 오래 실행된 쿼리를 찾을 수 있습니다.
특정 사용자의 쿼리에 집중하려면 User 드롭다운을 사용하여 사용자를 선택하십시오.
특정 웨어하우스에서 실행된 쿼리에 집중하려면 Filters » Warehouse 를 선택한 다음 웨어하우스를 선택하십시오.
- 웨어하우스:
Snowsight 에 로그인합니다.
웨어하우스에 대한 권한이 있는 역할로 전환합니다.
Admin » Warehouses 를 선택합니다.
웨어하우스를 선택합니다.
Warehouse Activity 차트를 사용하여 쿼리가 큐에 있었는지 여부를 포함하여 웨어하우스의 로드를 시각화합니다.
- 작업:
Snowsight 에 로그인합니다.
작업의 SQL 코드를 실행하는 데 걸린 시간을 보려면 Monitoring » Task History 를 선택하십시오.
실행 시간으로 드릴다운하기¶
Query Profile 을 사용하면 쿼리에서 실행하는 데 가장 오래 걸리는 부분을 검사할 수 있습니다. 여기에는 실행하는 데 가장 오래 걸리는 연산자 노드를 식별하는 Most Expensive Nodes 창이 포함됩니다. 노드의 실행 시간 중 쿼리 처리의 특정 범주에서 소요된 비율을 확인하여 더 자세히 드릴다운할 수 있습니다.
쿼리의 Query Profile에 액세스하는 방법:
Snowsight 에 로그인합니다.
Monitoring » Query History 를 선택합니다.
쿼리의 쿼리 ID를 선택합니다.
Query Profile 탭을 선택합니다.
팁
GET_QUERY_OPERATOR_STATS 함수를 실행하여 Query Profile의 성능 통계에 프로그래밍 방식으로 액세스할 수 있습니다.
실행 시간 탐색을 위한 쿼리 작성하기¶
Account Usage 스키마에는 쿼리 및 작업의 실행 시간과 관련된 뷰가 포함되어 있습니다. 또한 쿼리를 실행할 때 웨어하우스의 로드와 관련된 뷰도 포함합니다. 이러한 뷰에 대한 쿼리를 작성하여 성능 데이터를 드릴다운하고 사용자 지정 보고서 및 대시보드를 생성할 수 있습니다.
기본적으로 계정 관리자(즉, ACCOUNTADMIN 역할이 있는 사용자)만 ACCOUNT_USAGE 스키마의 뷰에 액세스할 수 있습니다. 다른 사용자가 이러한 뷰에 액세스하도록 허용하려면 다른 역할에 대한 SNOWFLAKE 데이터베이스 사용 활성화하기 섹션을 참조하십시오.
ACCOUNT_USAGE 스키마에 대한 액세스 권한이 없는 사용자(예: 쿼리를 실행한 사용자 또는 웨어하우스 관리자)는 여전히 Information Schema의 QUERY_HISTORY 테이블 함수 를 사용하여 최근 실행 시간 및 기타 쿼리 메타데이터를 반환할 수 있습니다.
ACCOUNT_USAGE 뷰는 쿼리 또는 작업을 실행한 직후에 업데이트되지 않습니다. 쿼리를 실행한 직후 쿼리의 실행 시간을 확인하려면 Snowsight 를 사용하여 성능을 확인 하십시오. 또한 Information Schema는 ACCOUNT_USAGE 뷰보다 빠르게 업데이트됩니다.
ACCOUNT_USAGE 뷰 |
설명 |
대기 시간 |
---|---|---|
지난 365일(1년) 내 다양한 차원(시간 범위, 실행 시간, 세션, 사용자, 웨어하우스 등)별로 Snowflake 쿼리 기록을 분석하는 데 사용됩니다. |
최대 45분 |
|
지정된 날짜 범위 내에서 웨어하우스의 워크로드를 분석하는 데 사용됩니다. |
최대 3시간 |
|
지난 365일(1년) 내 작업 사용 기록을 검색하는 데 사용됩니다. |
최대 45분 |
예제 쿼리¶
ACCOUNT_USAGE 스키마에 대한 다음 쿼리는 쿼리, 웨어하우스, 작업의 과거 성능에 대한 인사이트를 제공합니다. 전체 SQL 예제를 보려면 쿼리의 이름을 클릭하십시오.
- 쿼리 성능:
- 웨어하우스 로드:
- 작업 성능:
쿼리 성능¶
쿼리: 상위 n개의 최장 실행 쿼리¶
이 쿼리는 마지막 날에 가장 오래 실행된 상위 n개(아래 예에서는 50개)개 쿼리의 목록을 제공합니다. DATEADD
함수를 조정하여 더 짧거나 더 긴 기간에 집중할 수 있습니다. my_warehouse
를 웨어하우스 이름으로 바꿉니다.
SELECT query_id,
ROW_NUMBER() OVER(ORDER BY partitions_scanned DESC) AS query_id_int,
query_text,
total_elapsed_time/1000 AS query_execution_time_seconds,
partitions_scanned,
partitions_total,
FROM snowflake.account_usage.query_history Q
WHERE warehouse_name = 'my_warehouse' AND TO_DATE(Q.start_time) > DATEADD(day,-1,TO_DATE(CURRENT_TIMESTAMP()))
AND total_elapsed_time > 0 --only get queries that actually used compute
AND error_code IS NULL
AND partitions_scanned IS NOT NULL
ORDER BY total_elapsed_time desc
LIMIT 50;
쿼리: 지난달 실행 시간별로 구성된 쿼리¶
이 쿼리는 지난달에 실행 시간 동안 지정된 웨어하우스에 대한 쿼리를 버킷별로 그룹화합니다. 쿼리 완료 시간의 이러한 추세는 웨어하우스의 크기를 조정하거나 일부 쿼리를 다른 웨어하우스로 분리하는 의사 결정을 내리는 데 영향을 미칠 수 있습니다. MY_WAREHOUSE
를 웨어하우스 이름으로 바꿉니다.
SELECT
CASE
WHEN Q.total_elapsed_time <= 60000 THEN 'Less than 60 seconds'
WHEN Q.total_elapsed_time <= 300000 THEN '60 seconds to 5 minutes'
WHEN Q.total_elapsed_time <= 1800000 THEN '5 minutes to 30 minutes'
ELSE 'more than 30 minutes'
END AS BUCKETS,
COUNT(query_id) AS number_of_queries
FROM snowflake.account_usage.query_history Q
WHERE TO_DATE(Q.START_TIME) > DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP()))
AND total_elapsed_time > 0
AND warehouse_name = 'my_warehouse'
GROUP BY 1;
쿼리: 장시간 실행되는 반복 쿼리 찾기¶
쿼리 해시 (ACCOUNT_USAGE QUERY_HISTORY 뷰의 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;
쿼리: 시간 경과에 따른 쿼리의 평균 성능 추적¶
다음 문으로 매개 변수가 있는 특정 쿼리 해시(cbd58379a88c37ed6cc0ecfebb053b03
)를 가진 모든 쿼리에 대해 일일 평균 총 경과 시간을 계산합니다.
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);
웨어하우스 로드¶
쿼리: 총 웨어하우스 로드¶
이 쿼리는 실행된 쿼리와 큐에 있는 쿼리에 대해 웨어하우스의 총 로드에 대한 인사이트를 제공합니다. 이러한 로드 값은 어떤 간격에서 특정 상태에 있는 모든 쿼리의 총 실행 시간(초)을 그 간격의 총 시간(초)으로 나눈 비율을 나타냅니다.
예를 들어 5분(300초) 간격에서 4개 쿼리의 총 시간이 276초라면 쿼리 로드 값은 276 / 300 = 0.92입니다.
SELECT TO_DATE(start_time) AS date,
warehouse_name,
SUM(avg_running) AS sum_running,
SUM(avg_queued_load) AS sum_queued
FROM snowflake.account_usage.warehouse_load_history
WHERE TO_DATE(start_time) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2
HAVING SUM(avg_queued_load) >0;
작업 성능¶
쿼리: 가장 오래 실행 중인 작업¶
이 쿼리는 마지막 날 가장 오래 실행 중인 작업을 나열하며 작업에서 실행 중인 SQL을 최적화할 기회를 나타낼 수 있습니다.
SELECT DATEDIFF(seconds, query_start_time,completed_time) AS duration_seconds,*
FROM snowflake.account_usage.task_history
WHERE state = 'SUCCEEDED'
AND query_start_time >= DATEADD (day, -1, CURRENT_TIMESTAMP())
ORDER BY duration_seconds DESC;