配置单元未在查询中使用分区

swvgeqrz  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(293)

我有一个视图,可以为配置单元历史记录表提取最新的数据。历史表是按天划分的。视图的工作方式非常简单,它有一个子查询,在date字段(用作分区的字段)上执行max date,然后根据该值过滤表。该表包含数百天(分区),每个分区有数百万行。为了加快子查询的速度,我尝试将扫描的分区限制为最后创建的分区。为了考虑假期周末,我将返回四天以确保查询返回数据。
如果我用日期硬编码这些值,子查询运行得非常快,并且正确地限制了分区。
但是,如果我试图用一个子查询来限制分区以计算最后一个分区,它将无法识别分区并执行完整表扫描。当过滤器工作时,查询将返回正确的结果,但这需要很长时间,因为它不限制扫描的分区。
我尝试将子查询作为with语句来执行,然后在bus\ U date上使用内部联接,但得到的结果相同:没有使用分区。
该行为可以通过查询重复,因此我将使用它而不是视图来演示:

SELECT *
  FROM a.transactions
 WHERE bus_date IN (SELECT MAX (bus_date)
                      FROM a.transactions maxtrans
                     WHERE bus_date >= date_sub (CURRENT_DATE, 4));

没有错误消息,查询实际上也可以工作(过滤以提取正确的数据),但是它会扫描所有分区,因此速度非常慢。如何限制查询使用子查询中标识的分区?

pes8fvy9

pes8fvy91#

我仍然希望有人会有一个答案,但我确实想张贴的变通办法,我已经想出的情况下,它是对其他人有用。 SELECT * FROM a.transactions WHERE bus_date >= date_sub (CURRENT_DATE, 4) AND bus_date IN (SELECT MAX (bus_date) FROM a.transactions maxtrans WHERE bus_date >= date_sub (CURRENT_DATE, 4)); 查询有点笨拙,因为它在两次筛选业务日期。第一次将主数据集限制在最后四天(这将限制到那些分区并避免扫描所有分区),第二次将其固定到加载数据的最后一天(通过max-bus-u-date)。这远不是完美的,但是执行起来比扫描所有分区的查询要好得多。谢谢。

相关问题