쿼리 성능 향상을 위한 Top-K 정리¶
SELECT 문에 LIMIT 및 ORDER BY 절이 포함된 경우, Snowflake는 일반적으로 모든 행이 상위 K 결과(여기서 K는 LIMIT 절의 값)에 포함될 수 있으므로 모든 적격 행을 검사합니다. 상위 K 정리를 사용하면 나머지 행이 K 레코드로 구성된 결과 세트에 포함될 수 없다고 판단되면 Snowflake가 스캔을 중지합니다.
Top-K 정리는 LIMIT 및 ORDER BY 절을 포함하는 SELECT 문의 성능을 향상시킬 수 있습니다. 큰 테이블의 쿼리는 Top-K 정리를 통해 가장 많은 이점을 얻을 수 있습니다.
Top-K 정리를 사용하는 쿼리¶
Snowflake는 다음 사항이 모두 해당하는 경우에만 상위 K개 잘라내기를 적용합니다.
쿼리에는 ORDER BY 절과 LIMIT 절이 모두 포함되어 있습니다.
ORDER BY 절에 지정된 첫 번째 열은 다음 데이터 타입 중 하나를 갖습니다.
정수로 표현 가능한 데이터 타입(예: INTEGER 타입, DATE 타입 또는 TIMESTAMP 타입). 형 변환과 같이 정수를 반환하는 식은 지원되지 않습니다.
문자열 또는 이진 데이터 타입, 정렬된 문자열 포함.
지원되는 기본 유형(즉, 이전 두 글머리 기호 목록 항목에 나열된 유형)이 있는 VARIANT 열의 필드이며 해당 기본 유형으로 형 변환됩니다.
여러 열을 지정한 경우 Snowflake는 첫 번째 열만 고려합니다.
쿼리에 조인이 포함된 경우 ORDER BY 열은 더 큰 테이블의 열입니다. 데이터 웨어하우스에서 더 큰 테이블을 종종 팩트 테이블 또는 프로브 측이라고 합니다. 더 작은 테이블을 차원 테이블 이라고 합니다.
이미 빠른 LIMIT 절이 있는 쿼리(예: 전체 테이블 스캔이 빠른 쿼리)는 Top-K 정리의 이점을 누리지 못할 수 있습니다. K 행보다 적은 수의 행을 반환하는 쿼리도 혜택을 받지 못합니다.
null 가능 필드에 ORDER BY … DESCENDING 을 포함하는 쿼리는 NULLS LAST 도 지정하는 경우에만 잘라냅니다.
VARIANT 열에 대한 쿼리¶
이 섹션에서는 VARIANT 열의 필드에 대한 쿼리 예제를 제공하여 Top-K 정리를 사용할 수 있는 쿼리 유형을 보여 줍니다.
VARIANT 열이 있는 테이블을 만들고 데이터를 삽입합니다.
CREATE OR REPLACE TABLE variant_topk_test (var_col VARIANT);
INSERT INTO variant_topk_test
SELECT PARSE_JSON(column1)
FROM VALUES
('{"s": "aa", "i": 1}'),
('{"s": "bb", "i": 2}'),
('{"s": "cc", "i": 3}'),
('{"s": "dd", "i": 4}'),
('{"s": "ee", "i": 5}'),
('{"s": "ff", "i": 6}'),
('{"s": "gg", "i": 7}'),
('{"s": "hh", "i": 8}'),
('{"s": "ii", "i": 9}'),
('{"s": "jj", "i": 10}');
이 테이블은 예를 제공하기 위해 비교적 작은 테이블이지만, 탑-K 정리는 더 큰 테이블에 유리하다는 점을 기억하십시오.
이 테이블의 다음 쿼리는 Top-K 정리를 사용할 수 있습니다.
SELECT * FROM variant_topk_test ORDER BY TO_VARCHAR(var_col:s) LIMIT 5;
SELECT * FROM variant_topk_test ORDER BY var_col:s::VARCHAR LIMIT 5;
SELECT * FROM variant_topk_test ORDER BY TO_NUMBER(var_col:i) LIMIT 5;
SELECT * FROM variant_topk_test ORDER BY var_col:i::NUMBER LIMIT 5;
다음 쿼리는 값이 기본 데이터 타입으로 형 변환되지 않으므로 Top-K 정리를 사용할 수 없습니다.
SELECT * FROM variant_topk_test ORDER BY var_col:s LIMIT 5;
다음 쿼리는 값이 기본 데이터 타입과 다른 데이터 타입으로 형 변환되므로 Top-K 정리를 사용할 수 없습니다.
SELECT * FROM variant_topk_test ORDER BY var_col:i::VARCHAR LIMIT 5;
집계 함수가 포함된 쿼리¶
집계 함수 가 포함된 쿼리는 다음 조건을 모두 충족하는 경우에만 잘라냅니다.
여기에는 GROUP BY 절이 포함됩니다.
첫 번째 ORDER BY 열은 GROUP BY 열이기도 합니다.
예를 들어, 다음 쿼리는 첫 번째 ORDER BY 열 c2
또한 GROUP BY 열이며 집계된 열이 아니므로 Top-K 정리를 사용할 수 있습니다.
SELECT c1, c2, c3, COUNT(*) AS agg_col
FROM mytable
GROUP BY c1, c2, c3
ORDER BY c2, c1, agg_col, c3
LIMIT 5;
다음 쿼리는 첫 번째 ORDER BY 열 agg_col
이 집계된 열이므로 Top-K 정리를 사용할 수 없습니다.
SELECT c1, c2, c3, COUNT(*) AS agg_col
FROM mytable
GROUP BY c1, c2, c3
ORDER BY agg_col, c2, c1
LIMIT 5;