![]() |
SQL-Statement vereinfachen
Hallo,
ich habe ein SQL-Statement bei welchem sich die Anwendung komplett aufhängt:
SQL-Code:
bei dem Subselect hängt er, ich vermute die DB muss da viel arbeiten.
select distinct(emailadresse) from freischaltungen where length(trim(emailadresse))>0 and produkt in ("P1","P2")and emailadresse not in(select emailadresse from freischaltungen where produkt not in ("P1","P2"))
Die Frage ist jetzt, wie vereinfach ich das am Besten? |
Re: SQL-Statement vereinfachen
Welches DBMS?
Versuch es mal mit einem Join BTw. Warum schreibst du nicht in der Datenbank-Sparte? |
Re: SQL-Statement vereinfachen
Zitat:
DBMS: MySQL. Ein Join? Wie sollte der hier aussehen? Also was ich eig erreichen will: Ich hab eine Tabelle mit Freischaltcodes in der unter anderem die Emailadresse und das Produkt drinstehn. Nun möchte ich alle Emailadressen die Produkt 1 und Produkt 2 haben, ausser denen die zusätzlich eines der anderen Produkte haben. |
Re: SQL-Statement vereinfachen
Evtl. so?
SQL-Code:
SELECT DISTINCT(A.emailadresse)
FROM freischaltungen A LEFT JOIN freischaltungen B ON B.emailadresse = A.emailadresse AND B.produkt NOT IN ("P1","P2") WHERE A.produkt IN ("P1","P2") AND B.emailadresse IS NULL |
Re: SQL-Statement vereinfachen
Ich hab jetzt so ein Statement mit join, welches mir allerdings gerademal ein siebtel der Ergebnisse der Abfrage von davor liefert :gruebel:
Ist jedoch deutlich schneller als die Abfrage zuvor.
SQL-Code:
select emailadresse from freischaltungen as f1 inner join freischaltungen as f2 on f2.emailadresse = f1.emailadresse where f1.id <> f2.id and f1.produkt in ("P1","P2") and f2.produkt not in("P1","P2")
|
Re: SQL-Statement vereinfachen
Zitat:
Also, wenn ich mich richtig irre, liefert dir dein join ganu die Sätze, die du NICHT haben willst. |
Re: SQL-Statement vereinfachen
ach deswegen sind das so wenig :lol:
hmm.. also meinen denkfehler seh ich.. aber wie ich das amche das ich das gewünschte Ergebnis bekomme weis ich grad trotzdem net.. |
Re: SQL-Statement vereinfachen
Schau mal
![]() |
Re: SQL-Statement vereinfachen
|
Re: SQL-Statement vereinfachen
Versuch es doch mal so...
SQL-Code:
Gruss
SELECT DISTINCT a.emailadresse
FROM freischaltungen a LEFT JOIN (SELECT DISTINCT emailadresse FROM freischaltungen WHERE produkt NOT IN ('P1', 'P2')) b ON a.emailadresse = b.emailadresse WHERE a.produkt IN ('P1', 'P2') AND b.emailadresse IS NULL Thorsten |
Re: SQL-Statement vereinfachen
Also nachdem ich das Ergebnis mal Stichprobenweise geprüft habe, komme ich zu dem Schluss das die ABfrage korrekt ist.
Das Problem - und deswegen wollte ich das ganze vereinfachen - ist, dass der Server sich bei dieser Abfrage in die Knie geht, bzw. 10 Minuten rechnet bis dann irgendwann das Ergebnis kommt.. (Das ist deutlich zu viel!) Die Tabelle mit den Freischaltungen hat weit über 10.000 Einträge, wodurch das scheinbar extrem viel zu berechnen gibt. |
Re: SQL-Statement vereinfachen
Vieeleicht sind auch nur die Indizes nicht optimal
|
Re: SQL-Statement vereinfachen
Zitat:
Was so ein Index ausmachen kann, aus 10 Minuten werden 5 Sekunden :shock: |
Re: SQL-Statement vereinfachen
Zitat:
Ohne Index muss der Server alle Datensätze sequentiell durchgehen, um einen passenden Eintrag zu finden. In deinem Fall sind das 10.000 mal eine Schleife à la "For i:=1 to 10000 Do FindProduct(Record[i])". Mit Index findet der Server den passenden Eintrag eigentlich "sofort". In deinem Fall fällt somit die innere Schleife quasi weg. Dafür muss der Server dann für eine Email-Adresse alle Datensätze widerum sequentiell nach den Produkten durchsuchen. |
Re: SQL-Statement vereinfachen
Was ist denn ein compound index? :gruebel:
Bzw wie sieht der aus? |
Re: SQL-Statement vereinfachen
"Rüsselmops", aber nicht wissen, was ein 'compound index' ist. Sowas haben wir gerne :zwinker:.
Es handelt sich um einen zusammengesetzten Index, also z.B. 'email+Produkt'. Wenn der Server nach email und Produkt(en) suchen soll, dann kann er diesen Index optimal verwenden, weil er direkt nach z.B. "meier@bla.de"+"P1" suchen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz