我试图优化一个非常长且复杂的impala查询,它包含多个cte。每个cte使用多次。我的期望是,一旦创建了一个cte,我应该能够指示impala在主查询中重新使用这个cte的结果,而不是用主查询再次扫描cte中涉及的表上的hdfs操作。这可能吗?如果是,怎么做?
我使用的是impalad版本2.1.1-cdh5发行版(build 7901877736e29716147c4804b0841afc4ebc9037)版本
我试图优化一个非常长且复杂的impala查询,它包含多个cte。每个cte使用多次。我的期望是,一旦创建了一个cte,我应该能够指示impala在主查询中重新使用这个cte的结果,而不是用主查询再次扫描cte中涉及的表上的hdfs操作。这可能吗?如果是,怎么做?
我使用的是impalad版本2.1.1-cdh5发行版(build 7901877736e29716147c4804b0841afc4ebc9037)版本
2条答案
按热度按时间ego6inou1#
我不这么认为。我相信with子句不会创建任何永久性对象,它只是为了避免新表或视图将名称空间弄乱,并通过重新排序和替换单个部分使重构大型复杂查询更容易。with子句中使用的查询很适合将来成为视图,或者在etl过程中具体化为摘要表。
46scxncf2#
这可能吗?
cte的真正目的是重用从前面的查询(使用
with
子句)通过下面的查询,SELECT
. 所以我不明白为什么不可能。使用
Explain
您的查询,以找出实际扫描hdfs的详细信息。有关更多与i/o相关的细节,请使用
profile
如官方文件所示https://www.cloudera.com/documentation/enterprise/5-7-x/topics/impala_explain_plan.html#perf_profile