검색 최적화로 혜택을 받는 쿼리 식별

검색 최적화로 혜택을 받는 쿼리 식별

검색 최적화는 많은 쿼리의 성능을 향상시킬 수 있습니다. 이 주제는 검색 최적화가 가장 도움이 되는 쿼리의 종류 특성과 반대로 혜택을 받지 못하는 쿼리의 종류를 설명합니다.

출처: Snowflake 문서

본문

일반 쿼리 특성

검색 최적화는 다음 특성을 가진 쿼리의 성능을 향상시키는 데 가장 잘 작동합니다.

  • 쿼리가 기본 클러스터 키가 아닌 다른 열을 포함하는 경우.
  • 쿼리가 (검색 최적화를 적용하기 전에) 보통 몇 초 이상 실행되는 경우. 대부분의 경우 검색 최적화는 1초 미만의 실행 시간을 가진 쿼리의 성능을 실질적으로 향상시키지 않습니다.
  • 쿼리 필터 작업이 접근하는 열 중 적어도 하나가 약 100,000개 이상의 고유 값을 갖는 경우. 고유 값 수를 결정하려면 다음 중 하나를 사용할 수 있습니다.

APPROX_COUNT_DISTINCT를 사용해 대략적인 고유 값 수를 얻습니다:

SELECT APPROX_COUNT_DISTINCT(column1) FROM table1;
  • COUNT(DISTINCT <col_name>)를 사용해 실제 고유 값 수를 얻습니다:
SELECT COUNT(DISTINCT c1), COUNT(DISTINCT c2) FROM test_table;

고유 값 수의 근사치만 필요하므로, 일반적으로 COUNT(DISTINCT <col_name>)보다 더 빠르고 저렴한 APPROX_COUNT_DISTINCT를 사용하는 것을 고려하세요.

지원되는 데이터 타입

검색 최적화 서비스는 현재 다음 데이터 타입을 지원합니다.

다른 데이터 타입의 다른 값(예: FLOAT, DECFLOAT, GEOMETRY)을 포함하는 쿼리는 혜택을 받지 못합니다.

지원되는 테이블 타입

검색 최적화 서비스는 현재 다음 유형의 테이블을 지원합니다.

검색 최적화 서비스는 현재 다음 유형의 테이블을 지원하지 않습니다.

지원되는 조건부 유형

검색 최적화는 이러한 종류의 조건부를 사용하는 쿼리의 성능을 향상시킬 수 있습니다.

조합(COLLATION) 지원

검색 최적화는 COLLATE 절 로 정의된 열의 쿼리 성능을 향상시킬 수 있으며, 검색 방법에 따라 다릅니다.

  • EQUALITY 검색 방법을 사용해 열에 검색 최적화가 활성화 되면 모든 조합 지정이 지원됩니다.
  • FULL_TEXT 또는 SUBSTRING 검색 방법을 사용해 열에 검색 최적화가 활성화되면 'utf8' 또는 'bin' 조합 지정이 지원됩니다.

검색 방법에 대한 자세한 내용은 ALTER TABLE … ADD SEARCH OPTIMIZATION 을 참고하세요.

검색 최적화는 COLLATE 함수를 사용해 열의 조합 지정을 변경하는 조건부를 지원하지 않습니다.

예를 들어 조합 지정이 있는 열이 있는 테이블을 만들고 행을 삽입하세요.

CREATE OR REPLACE TABLE search_optimization_collation_demo (
  en_ci_col VARCHAR COLLATE 'en-ci',
  utf_8_col VARCHAR COLLATE 'utf8');

INSERT INTO search_optimization_collation_demo VALUES (
  'test_collation_1',
  'test_collation_2');

테이블의 두 열 모두에 동등성 조건부에 대한 검색 최적화를 활성화하세요.

ALTER TABLE search_optimization_collation_demo
  ADD SEARCH OPTIMIZATION ON EQUALITY(en_ci_col, utf_8_col);

다음 쿼리는 검색 최적화의 혜택을 받을 수 있습니다.

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2';

다음 쿼리는 COLLATE 함수를 사용해 utf_8_col 열의 조합 지정을 변경하므로 검색 최적화의 혜택을 받을 수 없습니다.

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col COLLATE 'de-ci' = 'test_collation_2';

다음 쿼리도 검색 최적화의 혜택을 받을 수 없습니다. 조합 우선순위 규칙 에 따라 쿼리는 COLLATE 함수를 사용해 utf_8_col 열에 'de-ci' 조합 지정을 적용합니다.

SELECT *
  FROM search_optimization_collation_demo
  WHERE utf_8_col = 'test_collation_2' COLLATE 'de-ci';

Apache Iceberg™ 테이블 지원

검색 최적화는 Apache Iceberg™ 테이블의 쿼리 성능을 향상시킬 수 있습니다. Iceberg 테이블에 대한 검색 최적화 구성에 대한 정보는 ALTER ICEBERG TABLE 을 참고하세요.

다음 제한 사항이 Iceberg 테이블에 대한 검색 최적화 지원에 적용됩니다.

  • Iceberg 테이블이 지원하지 않는 데이터 타입의 열에는 검색 최적화를 추가할 수 없으며, 여기에는 반정형 및 지리공간 데이터 타입이 포함됩니다. 자세한 내용은 Apache Iceberg™ 테이블용 데이터 타입 을 참고하세요.
  • Apache Parquet™ 파일이 너무 크면(예: 압축된 수백 메가바이트), 일부 시나리오에서 쿼리가 검색 최적화 서비스의 혜택을 완전히 받지 못할 수 있습니다.

Snowflake 테이블에 대한 검색 최적화에 적용되는 다른 제한 사항도 Iceberg 테이블에 적용됩니다. 자세한 내용은 검색 최적화로 혜택을 받지 못하는 쿼리 를 참고하세요.

뷰에 대한 잠재적 개선

검색 최적화 서비스는 뷰(보안 뷰 포함)의 성능을 간접적으로 향상시킬 수 있습니다. 뷰의 기본 테이블에 검색 최적화가 활성화되어 있고 쿼리가 해당 테이블에 대한 선택적 조건부를 사용한다면, 검색 최적화 서비스는 행을 필터링할 때 성능을 향상시킬 수 있습니다. 지원되는 조건부 유형 을 참고하세요.

뷰의 모든 테이블에 검색 최적화가 활성화될 필요는 없습니다. 검색 최적화는 각 테이블에서 독립적으로 수행됩니다.

검색 최적화로 혜택을 받지 못하는 쿼리

현재 검색 최적화 서비스는 부동 소수점 데이터 타입, GEOMETRY, 또는 이미 논의되지 않은 다른 데이터 타입을 지원하지 않습니다. Snowflake는 미래에 더 많은 데이터 타입에 대한 지원을 추가할 수 있습니다.

또한 검색 최적화 서비스는 다음을 지원하지 않습니다.

  • 일부 테이블 타입. 자세한 내용은 지원되는 테이블 타입 을 참고하세요.
  • 구체화된 뷰(Materialized views).
  • 열 연결(Column concatenation).
  • 분석 표현식(Analytical expressions).
  • 테이블 열에 대한 캐스트(문자열로 캐스트된 고정 소수점 숫자 제외). 검색 최적화는 상수 값에 대한 암시적 및 명시적 캐스트가 있는 조건부를 지원하지만, 실제 테이블 열의 값(INTEGER 및 NUMBER에서 VARCHAR로의 캐스트 제외)을 캐스트하는 조건부는 지원하지 않습니다. 예를 들어 다음 조건부는 상수 값(테이블 열의 값이 아님)에 대한 암시적 및 명시적 캐스트를 사용하므로 지원됩니다.
-- Supported predicate
-- (where the string '2020-01-01' is implicitly cast to a date)
WHERE timestamp1 = '2020-01-01';

-- Supported predicate
-- (where the string '2020-01-01' is explicitly cast to a date)
WHERE timestamp1 = '2020-01-01'::date;

다음 조건부는 테이블 열의 값에 대한 캐스트를 사용하므로 지원되지 않습니다.

-- Unsupported predicate
-- (where values in a VARCHAR column are cast to DATE)
WHERE to_date(varchar_column) = '2020-01-01';

검색 최적화 서비스는 캐스트 이후가 아닌 원래 열 값을 고려합니다. 결과적으로 검색 최적화 서비스는 이러한 조건부가 있는 쿼리에 사용되지 않습니다.

언급한 대로, 이 규칙의 예외는 테이블 열의 NUMBER 또는 INTEGER 값을 VARCHAR 값으로 캐스트하는 것입니다. 검색 최적화 서비스는 이 유형의 조건부를 지원합니다.

-- Supported predicate
-- (where values in a numeric column are cast to a string)
WHERE cast(numeric_column as varchar) = '2'

검색 최적화는 활성 데이터에서만 작동하므로 Time Travel 을 사용하는 쿼리의 성능을 향상시키지 않습니다.

더 알아보기 (Learn more)