1
考慮以下查詢,其中發生跨兩個表的聚合:Sales和Promo以及聚合值再次用於計算。TERADATA:跨多個表彙總
SELECT
sales.article_id,
avg((sales.euro_value - ZEROIFNULL(promo.euro_value))/NULLIFZERO(sales.qty - ZEROIFNULL(promo.qty)))
FROM
( SELECT
sales.article_id,
sum(sales.euro_value),
sum(sales.qty)
from SALES_TABLE sales
where year >= 2011
group by article_id
) sales
LEFT OUTER JOIN
( SELECT
promo.article_id,
sum(promo.euro_value),
sum(promo.qty)
from PROMOTION_TABLE promo
where year >= 2011
group by article_id
) promo
ON sales.article_id = promo.article_id
GROUP BY sales.article_id;
上查詢一些注意事項:
- 兩個內查詢返回的行數量龐大,由於大量文章。在teradata上運行解釋,內部查詢本身佔用的時間非常少,但連接需要很長時間。
- 假定article_id上的主鍵存在,並且這兩個表按年分區。
- 左外連接,因爲第二個表包含可選數據。
所以,你可以建議一個更好的方式來寫這個查詢。感謝您閱讀這個:)
PROMO和SALES表的主要指標是什麼?這聽起來像一個線軸重新分配或傾斜問題可能會影響您的查詢。你能分享一下EXPLAIN嗎? –
這兩個內部查詢都會生成唯一的'article_id'值,因爲相應的結果按'article_id'分組。因此,您不需要在外部查詢中通過「article_id」進行分組。嘗試擺脫外部分組,看看是否以任何方式加快您的查詢。 –
是的,我同意。在此查詢中,外部組by不是必需的。但在性能方面,它沒有太大的區別 – dexter