在与分区列相关的列上过滤时的 Databricks 查询性能

Databricks query performance when filtering on a column correlated to the partition-column

设置:Delta-lake,Powerbi 使用的 Databricks SQL 计算。 我想知道以下情况:我们有一个列 timestamp 和一个派生列 date(即 timestamp 的日期),我们选择 partitionby 日期。当我们查询时我们在过滤器中使用timestamp不是 date.

我的理解是,databrikcs a priori 不会连接时间戳和日期,而且似乎不会从分区中获得任何优势。但由于文件实际上是按时间戳分区的(隐含的),当 databricks 查看所有文件的 min/max 时间戳时,它会发现它毕竟可以跳过大多数文件。所以看起来我们可以获得分区的相当大的好处,即使它在我们没有明确在查询中使用的列上。

  1. 这是正确的吗?
  2. 与直接使用分区相比,必须以这种方式过滤掉文件的性能成本(大致)是多少。
  3. databricks 是否会将所有 min/max 信息都存储在内存中,还是它必须出去查看每个查询的文件?

是的,Databricks 将通过 data skipping 隐含地利用此分区,因为将有 min/max 与特定数据文件关联的统计信息。 min/max 信息将从事务日志加载到内存中,但它需要决定在每次查询时需要命中哪些文件。但是因为一切都在内存中,所以在你拥有数十万个文件之前,它应该不会有很大的性能开销。

您可能会考虑一件事 - 使用 generated column 而不是明确的 date 列。将其声明为 date GENERATED ALWAYS AS (CAST(timestampColumn AS DATE)),并按其进行分区。优点是当您在 timestampColumn 上进行查询时,它应该自动对 date 列进行分区过滤。