在 Databricks SQL 中,我有一个需要永远执行的查询,在我们的旧系统中,该查询不会花费超过 2 小时(即使对于这部分查询,也需要 4 分钟)。我已将问题追溯到以下部分,它一直卡在日期时间比较上。如果我注释掉带有日期时间的部分,则只需不到 2 分钟即可执行。
额外信息:
表_x 的大小:28.000
table_y 的大小:23.500.000
表_z 的大小:19
日期时间值示例:2020-10-19T14:40:00.000
旧系统使用 OUTER APPLY 而不是 LEFT JOIN LATERAL,但这应该不是问题?
查询:
SELECT
count(1)
FROM table_x
LEFT JOIN LATERAL (SELECT
SUM(col_x)
FROM table_y
INNER JOIN table_z
ON table_y.z_id = table_z.`id`
WHERE table_y.col_y = table_x.col_y
AND table_y.`DATE` >= table_x.DAYDATEFROM
AND table_y.`DATE` < table_x.DAYDATEUNTIL
) xyz_data
我尝试注释掉日期时间,效果非常好。然后使用 table_y.DATE 中的值示例进行 where 过滤,据我尝试使用一些示例,这也不会导致任何问题或重复。
还有其他我可以尝试的策略吗?或者是否存在我没有发现的已知问题?
编辑:将列转换为 TIMESTAMP 似乎也没有帮助
您可以对字段进行分区,请参阅https://docs.databricks.com/en/tables/partitions.html
这里说它们是某种索引:Databricks (Spark SQL) 表的索引
因此,如果您可以按日期对表进行分区,那么基于这些日期的过滤器将会更快。
您需要确保您的日期字段确实也是日期类型。