优化与查询计划

使用 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 扩展与优化数据流水线

¡Vamos a practicar!

使用 Polars 扩展与优化数据流水线

Preparing Video For Download...