검색 최적화로 조인 쿼리 속도 향상
검색 최적화로 조인 쿼리 속도 향상
검색 최적화 서비스는 조인의 빌드 측(build side)에 소수의 고유 값이 있는 조인 쿼리의 성능을 향상시킬 수 있습니다.
예를 들어, 검색 최적화 서비스는 다음 유형의 조인 성능을 향상시킬 수 있습니다.
products가 각 상품에 대한 행을 포함하는 테이블이고sales가 상품의 각 판매에 대한 행을 포함하는 테이블이라고 가정해 보세요.products테이블은sales테이블보다 행이 적고 더 작습니다. 특정 상품의 모든 판매를 찾으려면sales테이블(더 큰 테이블)을products테이블(더 작은 테이블)과 조인합니다.products테이블이 작기 때문에 조인의 빌드 측에 고유 값이 적습니다. 참고: 데이터 웨어하우징에서 큰 테이블은 종종 팩트 테이블(fact table) 이라고 하고, 작은 테이블은 차원 테이블(dimension table) 이라고 합니다. 이 주제의 나머지 부분에서는 조인의 큰 테이블과 작은 테이블을 지칭할 때 이 용어를 사용합니다.customers가 각 고객에 대한 행을 포함하는 테이블이고sales가 각 판매에 대한 행을 포함하는 테이블이라고 가정해 보세요. 두 테이블 모두 큽니다. 특정 고객의 모든 판매를 찾으려면sales테이블(probe 측)을customers테이블(빌드 측)과 조인하고 필터를 사용해 조인의 빌드 측에 소수의 고유 값이 있도록 합니다.
다음 섹션은 조인 쿼리에 대한 검색 최적화 지원에 대한 자세한 정보를 제공합니다.
출처: Snowflake 문서
본문
조인 쿼리에 대한 검색 최적화 활성화
조인 쿼리의 성능을 향상시키려면 쿼리의 조인 조건부에 있는 열에 대해 검색 최적화가 활성화되어 있는지 확인하세요. 또한 조인의 빌드 측이 작은 차원 테이블이거나 선택적 필터 덕분에 소수의 고유 값을 갖도록 하세요. 쿼리의 검색 최적화 런타임 비용은 조인의 빌드 측에서 조회해야 하는 고유 값의 수에 비례합니다. 이 수가 너무 크면 Snowflake는 검색 액세스 경로 대신 일반 테이블 액세스 경로를 사용하기로 결정할 수 있습니다.
조인 쿼리의 성능을 향상시키려면 조인의 probe 측 테이블에 대해 검색 최적화를 활성화 하세요. 이 테이블은 보통 조인 쿼리에서 필터링되지 않는 큰 테이블, 예를 들어 팩트 테이블입니다.
ALTER TABLE … ADD SEARCH OPTIMIZATION 명령을 사용하세요.
- 특정 열에 대해 검색 최적화를 활성화합니다.
- 테이블의 모든 열에 대해 검색 최적화를 활성화합니다.
일반적으로 특정 열에 대해서만 검색 최적화를 활성화하는 것이 모범 사례입니다. ON EQUALITY 절을 사용해 열을 지정하세요. 이 예시는 특정 열에 대해 검색 최적화를 활성화합니다.
ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON EQUALITY(mycol);
지원되는 데이터 타입의 모든 열(반정형 및 GEOGRAPHY 제외)에 대해 EQUALITY를 지정하려면:
ALTER TABLE mytable ADD SEARCH OPTIMIZATION;
지원되는 조인 조건부
검색 최적화 서비스는 다음 유형의 조인 조건부가 있는 쿼리의 성능을 향상시킬 수 있습니다.
probe_side_table.column = build_side_table.column형태의 동등 조건부.- 조건부의 빌드 측 피연산자에 대한 변환(예: 문자열 연결, 덧셈 등).
- 여러 동등 조건부의 결합(
AND).
지원되는 조인 쿼리 예시
이 섹션은 검색 최적화의 혜택을 받을 수 있는 조인 쿼리 예시를 보여줍니다.
예시: 단순 동등 조건부
다음은 조인 조건부로 단순 동등 조건부를 사용하는 지원되는 쿼리의 예시입니다. 이 쿼리는 sales라는 테이블과 customers라는 테이블을 조인합니다. probe 측 테이블 sales는 크고 검색 최적화가 활성화되어 있습니다. 빌드 측 테이블 customers도 크지만, customer_id 열의 선택적 필터 덕분에 이 테이블의 입력은 작습니다.
SELECT sales.date, customer.name
FROM sales JOIN customers ON (sales.customer_id = customers.customer_id)
WHERE customers.customer_id = 2094;
예시: 차원 측 피연산자에 대해 변환된 조건부
다음 쿼리는 sales라는 팩트 테이블과 products라는 차원 테이블을 조인합니다. 팩트 테이블은 크고 검색 최적화가 활성화되어 있습니다. 차원 테이블은 작습니다.
이 쿼리는 조건부의 차원 측 피연산자를 변환하고(예: 조인 조건에서 값 곱하기) 검색 최적화의 혜택을 받을 수 있습니다.
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.old_id * 100)
WHERE product.category = 'Cutlery';
예시: 여러 열에 걸친 조건부
조인 조건부가 여러 열에 걸쳐 있는 쿼리는 검색 최적화의 혜택을 받을 수 있습니다.
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.id and sales.location = product.place_of_production)
WHERE product.category = 'Cutlery';
예시: 포인트 조회 필터와 조인 조건부를 사용하는 쿼리
일반 포인트 조회 필터와 조인 조건부를 모두 사용하는 쿼리에서 검색 최적화 서비스는 둘 다의 성능을 향상시킬 수 있습니다. 다음 쿼리에서 검색 최적화 서비스는 sales.location 포인트 조회 조건부와 product_id 조인 조건부를 모두 향상시킬 수 있습니다.
SELECT sales.date, product.name
FROM sales JOIN products ON (sales.product_id = product.id)
WHERE product.category = 'Cutlery'
AND sales.location = 'Buenos Aires';
제한 사항
다음 제한 사항이 검색 최적화 서비스와 조인 쿼리에 적용됩니다.
- 조인 조건부의 분리(
OR)는 현재 지원되지 않습니다. - LIKE, ILIKE, RLIKE 조인 조건부는 현재 지원되지 않습니다.
- VARIANT 열의 조인 조건부는 현재 지원되지 않습니다.
- [ NOT ] EQUAL_NULL 동등 조건부는 현재 지원되지 않습니다.
- 검색 최적화 서비스의 현재 제한 사항 이 조인 쿼리에도 적용됩니다.