최적화와 쿼리 플랜

Polars로 데이터 파이프라인 확장 및 최적화하기

Liam Brannigan

Data Scientist & Polars Contributor

쿼리 최적화 소개

행과 열이 있는 테이블 이미지

Polars로 데이터 파이프라인 확장 및 최적화하기

쿼리 최적화 소개

행과 열이 있는 테이블 이미지

Polars로 데이터 파이프라인 확장 및 최적화하기

쿼리 최적화 소개

직렬로 실행되는 작업 이미지

Polars로 데이터 파이프라인 확장 및 최적화하기

쿼리 최적화 소개

병렬로 실행되는 작업 이미지

Polars로 데이터 파이프라인 확장 및 최적화하기

쿼리 최적화 소개

중복 작업이 두 번 수행되는 파이프라인

Polars로 데이터 파이프라인 확장 및 최적화하기

쿼리 최적화 소개

중복 작업이 두 번 수행되는 파이프라인

Polars로 데이터 파이프라인 확장 및 최적화하기

부서별 최다 요청 유형

department_request_types = (
    requests





)
Polars로 데이터 파이프라인 확장 및 최적화하기

부서별 최다 요청 유형

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")




)
Polars로 데이터 파이프라인 확장 및 최적화하기

부서별 최다 요청 유형

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")



)
Polars로 데이터 파이프라인 확장 및 최적화하기

부서별 최다 요청 유형

department_request_types = (
    requests    
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")
    .agg(pl.col("TYPE").n_unique().alias("n_request_types"))


)
Polars로 데이터 파이프라인 확장 및 최적화하기

부서별 최다 요청 유형

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")
    .agg(pl.col("TYPE").n_unique().alias("n_request_types"))
    .sort("n_request_types", descending=True)
    .head(5)
)
  • 단순 플랜
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화 전 플랜

print(department_request_types)
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화 전 플랜

print(department_request_types)







        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화 전 플랜

print(department_request_types)





      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화 전 플랜

print(department_request_types)


    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화 전 플랜

print(department_request_types)
SLICE[offset: 0, len: 5]
  SORT BY [descending: [true]] [col("n_request_types")]
    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화된 플랜

print(department_request_types.explain())
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화된 플랜







        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화된 플랜






      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화된 플랜



    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Polars로 데이터 파이프라인 확장 및 최적화하기

최적화된 플랜

SORT BY [slice: (0, 10, ...), descending: [true]] [col("n_request_types")]
  FILTER col("n_request_types").dynamic_predicate() FROM
    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
  • n_request_types에서 상위 10개 행 탐색
  • 나머지 행 필터링
  • 10개 행 정렬
Polars로 데이터 파이프라인 확장 및 최적화하기

그래프로 보는 최적화된 플랜

print(department_request_types.show_graph())

최적화가 적용된 CSV 스캔을 보여주는 최적화된 플랜의 그래프 뷰

Polars로 데이터 파이프라인 확장 및 최적화하기

추가 최적화

(
    requests








)
Polars로 데이터 파이프라인 확장 및 최적화하기

추가 최적화

(
    requests
    .filter(pl.col("STATUS") == "Completed")
    .filter(pl.col("DEPARTMENT") == "Sanitation")






)
Polars로 데이터 파이프라인 확장 및 최적화하기

추가 최적화

(
    requests
    .filter(pl.col("STATUS") == "Completed")
    .filter(pl.col("DEPARTMENT") == "Sanitation")
    .with_columns(
        pl.col("TYPE").str.to_lowercase().alias("type_lower")
    )
    .with_columns(
        pl.col("STATUS").str.to_lowercase().alias("status_lower")
    )
)
Polars로 데이터 파이프라인 확장 및 최적화하기

추가 최적화



  Csv SCAN [311_Service_Requests.csv]
  PROJECT */39 COLUMNS
  SELECTION: [([(col("DEPARTMENT")) == ("Sanitation")]) & ([(col("STATUS")) == ("Completed")])]
  • AND 조건 결합
Polars로 데이터 파이프라인 확장 및 최적화하기

추가 최적화

 WITH_COLUMNS:
 [col("TYPE").str.to_lowercase().alias("type_lower"), col("STATUS").str.to_lowercase().alias("status_lower")]
  Csv SCAN [311_Service_Requests.csv]
  PROJECT */39 COLUMNS
  SELECTION: [([(col("DEPARTMENT")) == ("Sanitation")]) & ([(col("STATUS")) == ("Completed")])]
  • AND 조건 결합
  • WITH_COLUMNS 표현식 묶음
Polars로 데이터 파이프라인 확장 및 최적화하기

연습해 봅시다!

Polars로 데이터 파이프라인 확장 및 최적화하기

Preparing Video For Download...