쿼리 성능 향상을 위한 Top-K 정리

SELECT 문에 LIMITORDER 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 절에 지정된 첫 번째 열은 다음 데이터 타입 중 하나를 갖습니다.

    여러 열을 지정한 경우 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}');
Copy

이 테이블은 예를 제공하기 위해 비교적 작은 테이블이지만, 탑-K 정리는 더 큰 테이블에 유리하다는 점을 기억하십시오.

이 테이블의 다음 쿼리는 Top-K 정리를 사용할 수 있습니다.

SELECT * FROM variant_topk_test ORDER BY TO_VARCHAR(var_col:s) LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY var_col:s::VARCHAR LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY TO_NUMBER(var_col:i) LIMIT 5;
Copy
SELECT * FROM variant_topk_test ORDER BY var_col:i::NUMBER LIMIT 5;
Copy

다음 쿼리는 값이 기본 데이터 타입으로 형 변환되지 않으므로 Top-K 정리를 사용할 수 없습니다.

SELECT * FROM variant_topk_test ORDER BY var_col:s LIMIT 5;
Copy

다음 쿼리는 값이 기본 데이터 타입과 다른 데이터 타입으로 형 변환되므로 Top-K 정리를 사용할 수 없습니다.

SELECT * FROM variant_topk_test ORDER BY var_col:i::VARCHAR LIMIT 5;
Copy

집계 함수가 포함된 쿼리

집계 함수 가 포함된 쿼리는 다음 조건을 모두 충족하는 경우에만 잘라냅니다.

  • 여기에는 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;
Copy

다음 쿼리는 첫 번째 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;
Copy