검색 최적화로 혜택을 받는 쿼리 식별
검색 최적화로 혜택을 받는 쿼리 식별
검색 최적화는 많은 쿼리의 성능을 향상시킬 수 있습니다. 이 주제는 검색 최적화가 가장 도움이 되는 쿼리의 종류 특성과 반대로 혜택을 받지 못하는 쿼리의 종류를 설명합니다.
출처: 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를 사용하는 것을 고려하세요.
지원되는 데이터 타입
검색 최적화 서비스는 현재 다음 데이터 타입을 지원합니다.
- 고정 소수점 숫자용 데이터 타입 (예: INTEGER 및 NUMERIC)
- 문자열 및 바이너리 데이터 타입 (예: VARCHAR 및 BINARY)
- 날짜 및 시간 데이터 타입 (예: DATE, TIME, TIMESTAMP)
- 반정형 데이터 타입 (예: VARIANT, OBJECT, ARRAY)
- 구조화 데이터 타입 (예: 구조화 ARRAY, OBJECT, MAP)
- GEOGRAPHY 데이터 타입
다른 데이터 타입의 다른 값(예: FLOAT, DECFLOAT, GEOMETRY)을 포함하는 쿼리는 혜택을 받지 못합니다.
지원되는 테이블 타입
검색 최적화 서비스는 현재 다음 유형의 테이블을 지원합니다.
- 표준 Snowflake 테이블
- Interactive 테이블
- Iceberg 테이블
- 동적 테이블
- Transient 테이블
검색 최적화 서비스는 현재 다음 유형의 테이블을 지원하지 않습니다.
지원되는 조건부 유형
검색 최적화는 이러한 종류의 조건부를 사용하는 쿼리의 성능을 향상시킬 수 있습니다.
- 동등성 및 IN을 사용하는 포인트 조회 쿼리.
- 조인 쿼리.
- 스칼라 서브쿼리를 사용하는 쿼리.
- 스칼라 함수를 사용하는 쿼리.
- SEARCH 및 SEARCH_IP 함수를 사용하는 문자 데이터(텍스트) 쿼리.
- 와일드카드와 정규 표현식을 사용하는 부분 문자열 쿼리.
- 반정형 데이터 검색.
- 구조화 데이터 검색.
- 지리공간 쿼리.
- 결합(AND)과 분리(OR)를 사용하는 쿼리.
조합(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 을 사용하는 쿼리의 성능을 향상시키지 않습니다.