Wie kann eine Abfrage wie die folgende über 16 Stunden dauern? (Wir haben die Ausführung gestoppt, um nach Optimierungen zu suchen, aber keiner von uns ist DB-Experte.) Es scheint, als sollte es sehr einfach sein, den satzbasierten Ausschluss durchzuführen, richtig?Warum läuft diese Abfrage so viel länger als die Summe der Unterabfragen?
SELECT
field
FROM
(subquery that returns 1173126 rows in 20 seconds)
WHERE
field NOT IN (subquery that returns 3927646 rows in 69 seconds)
Was sollte ich sonst noch in diese Notiz aufnehmen, um Sie mit genügend Informationen zu versorgen?
(Die eigentliche Abfrage folgt, falls etwas tricksy und spezifische Informationen gibt es, dass das Problem verursacht.)
SELECT blob FROM (
SELECT a.line1 + '|' + substring(a.zip,1,5) as blob
FROM registrations r
JOIN customers c ON r.custId = c.Id
JOIN addresses a ON c.addressId = a.Id
WHERE r.purchaseDate > DATEADD(year,-1,getdate())
GROUP BY a.line1 + '|' + substring(a.zip,1,5)) sq
WHERE blob NOT IN (
SELECT a.line1 + '|' + substring(a.zip,1,5) as blob
FROM registrations r
JOIN customers c ON r.custId = c.Id
JOIN addresses a ON c.addressId = a.Id
WHERE r.purchaseDate BETWEEN DATEADD(year,-5,getdate()) AND DATEADD(year,-1,getdate())
GROUP BY a.line1 + '|' + substring(a.zip,1,5))
Ja, wir finden "neue" Kunden und es gibt doppelte Zeilen1, Zip-Kombinationen über die IDs. – clweeks
@clweeks: also wenn es vor 3 Jahren einen Kauf von der gleichen Adresse gab, aber mit einer anderen ID, zählt das nicht als neu, oder? – Quassnoi
Korrekt.Jemand anderes im Haushalt könnte den Kauf getätigt haben (oder ihre Daten wurden schlecht abgeglichen) und wir suchen nach Adressen/Haushalten, die neue Einkäufe getätigt haben (wobei "neu" Leute einschließt, die vor über fünf Jahren gekauft haben, aber nicht seither). . – clweeks