私はsubscription
テーブルと私が参加する必要があるpayments
テーブルがあります。 私は2つのオプションの間で決定しようとしており、パフォーマンスが重要な考慮事項です。参加条件または以前のCTEに行番号フィルタを設定する必要がありますか?
以下の2つのオプションのどちらが優れていますか?
のみグループ毎id
とdate
(従ってrow_number()
分析機能)ごとに1つの行を取得するために私が必要としています私がインパラを使用していて、これらのテーブルは、大きな(行の複数百万)です。
私は私の質問を説明するためにクエリを短縮しています
OPTION 1:
WITH cte
AS (
SELECT *
, SUM(amount) OVER (PARTITION BY id, date)
AS sameday_total
, ROW_NUMBER() OVER (PARTITION BY id, date ORDER BY purchase_number DESC)
AS sameday_rownum
FROM payments
),
payment
AS (
SELECT *
FROM cte
WHERE sameday_rownum = 1
)
SELECT s.*
, p.sameday_total
FROM subscription
INNER JOIN payment ON s.id = p.id
OPTION 2:
WITH payment
AS (
SELECT *
, SUM(payment_amount) OVER (PARTITION BY id, date)
AS sameday_total
, ROW_NUMBER() OVER (PARTITION BY id, date ORDER BY purchase_number DESC)
AS sameday_rownum
FROM payments
)
SELECT s.*
, p.sameday_total
FROM subscription
INNER JOIN payment ON s.id = p.id
AND p.sameday_rownum = 1
条件を 'on'節に入れてください。 2つのCTEでクエリを混乱させる必要はありません。 –
ありがとうございます。インナー・ジョイントなので、パフォーマンスへの影響はありません。私はこれが最終的なSQLステートメントのSQL述語のwhere節フィルタリングとジョイン条件フィルタリングのパフォーマンスに似ているのだろうかと思ったのですか? – cdabel
クエリプランを見て、オプティマイザが最初または最後にフィルタを適用するかどうかを確認する必要があります。 – Connor