在与分区列相关的列上过滤时的 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 时间戳时,它会发现它毕竟可以跳过大多数文件。所以看起来我们可以获得分区的相当大的好处,即使它在我们没有明确在查询中使用的列上。
- 这是正确的吗?
- 与直接使用分区相比,必须以这种方式过滤掉文件的性能成本(大致)是多少。
- databricks 是否会将所有 min/max 信息都存储在内存中,还是它必须出去查看每个查询的文件?
是的,Databricks 将通过 data skipping 隐含地利用此分区,因为将有 min/max 与特定数据文件关联的统计信息。 min/max 信息将从事务日志加载到内存中,但它需要决定在每次查询时需要命中哪些文件。但是因为一切都在内存中,所以在你拥有数十万个文件之前,它应该不会有很大的性能开销。
您可能会考虑一件事 - 使用 generated column 而不是明确的 date
列。将其声明为 date GENERATED ALWAYS AS (CAST(timestampColumn AS DATE))
,并按其进行分区。优点是当您在 timestampColumn
上进行查询时,它应该自动对 date
列进行分区过滤。
设置:Delta-lake,Powerbi 使用的 Databricks SQL 计算。
我想知道以下情况:我们有一个列 timestamp
和一个派生列 date
(即 timestamp
的日期),我们选择 partitionby
日期。当我们查询时我们在过滤器中使用timestamp
,不是 date.
我的理解是,databrikcs a priori 不会连接时间戳和日期,而且似乎不会从分区中获得任何优势。但由于文件实际上是按时间戳分区的(隐含的),当 databricks 查看所有文件的 min/max 时间戳时,它会发现它毕竟可以跳过大多数文件。所以看起来我们可以获得分区的相当大的好处,即使它在我们没有明确在查询中使用的列上。
- 这是正确的吗?
- 与直接使用分区相比,必须以这种方式过滤掉文件的性能成本(大致)是多少。
- databricks 是否会将所有 min/max 信息都存储在内存中,还是它必须出去查看每个查询的文件?
是的,Databricks 将通过 data skipping 隐含地利用此分区,因为将有 min/max 与特定数据文件关联的统计信息。 min/max 信息将从事务日志加载到内存中,但它需要决定在每次查询时需要命中哪些文件。但是因为一切都在内存中,所以在你拥有数十万个文件之前,它应该不会有很大的性能开销。
您可能会考虑一件事 - 使用 generated column 而不是明确的 date
列。将其声明为 date GENERATED ALWAYS AS (CAST(timestampColumn AS DATE))
,并按其进行分区。优点是当您在 timestampColumn
上进行查询时,它应该自动对 date
列进行分区过滤。