最佳化與查詢計畫

使用 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...