Ich habe eine subscription
Tabelle und eine payments
Tabelle, die ich beitreten muss. Ich versuche, zwischen 2 Optionen zu entscheiden und die Leistung ist ein wichtiger Gesichtspunkt.Sollte ich einen Zeilennummernfilter im Join-Zustand oder in einem vorherigen CTE setzen?
Welche der folgenden beiden OPTIONEN wird besser funktionieren?
Ich bin mit Impala, und diese Tabellen sind groß (mehrere Millionen Zeilen) Ich bin, um nur für jede id
eine Reihe zu bekommen und date
Gruppierung (daher die row_number()
analytische Funktion).
Ich habe die Anfragen verkürzt meine Frage zu erläutern:
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
Setzen Sie die Bedingung in die On-Klausel. Sie müssen die Abfrage nicht mit zwei CTEs überladen. –
Danke. Also keine Auswirkung auf die Performance, da es sich um eine innere Verbindung handelt? Ich fragte mich, ob dies ähnlich der Leistung der Join-Bedingung Filterung im Vergleich zu Where-Klausel-Filterung im SQL-Prädikat der endgültigen SQL-Anweisung ist? – cdabel
Sie sollten in der Lage sein, den Abfrageplan zu sehen, um zu sehen, ob der Optimierer den Filter am Anfang oder am Ende anwenden wird. – Connor