동적 파일 정리

쿼리가 큰 Delta Lake 테이블을 더 작고 필터링된 테이블에 조인하면, 필터 값은 쿼리가 실행될 때까지 알 수 없습니다. 런타임 가지치기 없이, 쿼리는 큰 테이블 내 모든 파일을 스캔하며, 일치하는 행이 없는 파일까지 스캔합니다. 동적 파일 가지치기가 이 문제를 해결합니다. 런타임에 옵티마이저는 조인의 한쪽에서 나온 필터 결과를 Delta Lake 테이블의 스캔 단계로 푸시다운하고, 일치하는 행을 포함할 수 없는 파일은 건너뜁니다.

동적 파일 가지치기는 기본적으로 활성화되어 있습니다. 쿼리를 바꿀 필요는 없어요.

동적 파일 가지치기가 적용될 때

동적 파일 가지치기는 델타 레이크 테이블의 조인에만 적용됩니다. MERGE statement에서는 병합 조건이 소스 열과 대상 열을 동일하다고 비교할 때 소스의 조인 키 값을 사용해 대상 파일을 건너뜁니다. DELETE 및 UPDATE 문에서, 조건에 동일한 종류의 비교를 수행하는 하위 쿼리가 포함될 때 적용됩니다.

MERGE, UPDATE, DELETE 문에서 동적 파일 정리를 사용하려면 Photon이 활성화된 컴퓨팅이 필요합니다. SELECT 구문의 경우, Photon은 더 광범위하고 더 안정적인 동적 파일 가지치기를 지원합니다. Photon이 없으면 쿼리 형태와 실행 계획에 따라 동적 파일 가지치기가 SELECT 문에 계속 적용될 수 있습니다. Photon이란?을 참조하세요.

동적 파일 가지치기는 비분할 테이블과 비분할 열의 조인에서 성능 개선 효과가 가장 큽니다. 기본적으로, 조인 내 큰 Delta Lake 테이블이 최소 10GB 이상이고 파일이 최소 10개 이상일 때만 트리거됩니다. 구성을 참조하세요.

동적 파일 가지치기는 쓰기 충돌도 줄여줍니다. Delta Lake가 커밋 중 충돌을 검사할 때, 동적 파일 가지치기가 건너뛴 파일도 고려합니다. 이로 인해 실패한 거래 건수가 줄어듭니다. 격리 수준 및 쓰기 충돌을 참조하세요.

모범 사례

동적 파일 가지치기의 성능 효과는 데이터가 클러스터링되는 방식과 연관되어 있습니다. 조인하는 값들이 모든 파일에 분산되어 있다면, 동적 파일 가지치기는 몇 개의 파일만 건너뜁니다. 동적 파일 가지치기가 더 많은 파일을 건너뛰도록 돕기 위해 다음 방법을 따르세요:

  • 자주 조인하는 열에 리퀴드 클러스터링을 적용해 일치하는 행들이 더 적은 파일에 함께 위치하도록 하세요.
  • 동적 파일 가지치기에 MERGE, UPDATE, DELETE 문이 필요하므로 Photon 지원 컴퓨트를 사용하세요.

구성

대부분의 워크로드는 이 설정을 변경할 필요가 없습니다. 더 작은 델타 레이크 테이블과의 조인이 가지치기가 도움이 되지만 기본 크기나 파일 수 임계값 이하일 경우 임계값 조정을 고려해 보세요.

이 Apache Spark 구성 속성들은 동적 파일 가지치기를 제어합니다:

Property Type Default Description
spark.databricks.optimizer.dynamicFilePruning Boolean true 동적 파일 가지치기를 켜거나 끌 수 있습니다.
spark.databricks.optimizer.deltaTableSizeThreshold Long 10000000000 (10 GB) 동적 파일 가지치기를 유발하는 조인에서 큰 Delta Lake 테이블의 최소 바이트 크기입니다. 작은 테이블의 경우, 필터를 푸시다운하는 것보다 테이블 전체를 스캔하는 것이 보통 비용이 저렴합니다.
델타 레이크 테이블의 크기를 찾으려면 sizeInBytes을 실행하고 DESCRIBE DETAIL table_name 열을 확인해 보세요.
spark.databricks.optimizer.deltaTableFilesThreshold Integer 10 동적 파일 프루닝을 트리거하는 조인에서 큰 Delta Lake 테이블의 최소 파일 수. 테이블의 파일 수가 이 임계값보다 적으면 동적 파일 가지치기는 실행되지 않습니다. 왜냐하면 파일이 몇 개 없는 테이블에서는 가치가 없을 수 있기 때문입니다.
델타 레이크 테이블의 파일 수를 찾으려면 numFiles를 실행하고 DESCRIBE DETAIL table_name 열을 확인하세요.