我正在尝试优化包含多个CTE的非常长且复杂的impala查询。每个CTE多次使用。我的期望是,一旦创建了CTE,我应该能够直接指示这个CTE的结果应该在主查询中重复使用,而不是使用主查询再次对CTE中涉及的表进行SCAN HDFS操作。这可能吗?如果是的话怎么样?
我正在使用impalad版本2.1.1-cdh5 RELEASE(build 7901877736e29716147c4804b0841afc4ebc9037)版本
答案 0 :(得分:3)
我不这么认为。我相信WITH子句不会创建任何永久对象,它只是为了避免使用新表或视图混淆命名空间,并通过reor-更容易重构大型复杂查询 去除和更换他们的个别部分。 WITH子句中使用的查询是有朝一日成为视图或在ETL过程中实现为汇总表的良好候选者。
答案 1 :(得分:2)
这可能吗?
CTE的目的是通过以下查询(例如 CREATE TABLE #TEMP
(
Category VARCHAR(200),
YEAR1 NUMERIC,
Total MONEY
)
INSERT INTO #TEMP
SELECT 'beverages', 1996, 500
union
SELECT 'beverages', 1997, 750
union
SELECT 'Condiments', 1997, 1000
union
SELECT 'Condiments', 1996, 800
SELECT *
FROM
(
SELECT Category,YEAR1, Total FROM #TEMP
) AS SourceTable
PIVOT
(
AVG(Total) FOR YEAR1 IN ( [1996], [1997])
) AS PivotTable;
)重用前面的查询(使用with
子句)获得的结果。所以我不明白为什么不可能的原因。
在查询中使用SELECT
以查找实际的SCAN HDFS详细信息。
要获得更多与I / O相关的洞察,请使用Explain
,如官方文档https://www.cloudera.com/documentation/enterprise/5-7-x/topics/impala_explain_plan.html#perf_profile