JOIN dauert Minuten?!??!?

JOIN dauert Minuten?!??!?

am 29.03.2006 16:34:55 von theonly.mcseven

Herrje, ich bin am Verzweifeln. Ich habe drei Tabellen:
kunden, kunden_verbaende und umsaetze
~7500 ~8500 ~6000 Einträge

Wenn ich nun an die Kundentabelle per JOIN die
Kundenverbände dranhänge dauert das Minuten;
Obwohl das Kriterium (kunden.pKey) ein 7stelliger
INT ist.
Noch schlimmer wird es, wenn ich an das Gebilde
noch die Umsätze dranklatsche. Dann muß ich den
Rechner neustarten, weil er hängenbleibt.

Und das komische, selbst wenn ich zb mit WHERE
(plz LIKE '8%') den Zielkreis einschränke, gehts nicht
merkbar schneller. HIer mal die ganze Abfrage:

SELECT count(DISTINCT name1) AS anzahl, 'Alle' FROM kunden
LEFT JOIN umsaetze ON umsaetze.kdnr=3Dkunden.kdnr
WHERE (plz=3D$plzstr) AND (umsaetze.kdnr!=3D '0')
UNION
SELECT count(DISTINCT name1) AS anzahl, verband_kurz FROM kunden
LEFT JOIN umsaetze ON umsaetze.kdnr=3Dkunden.kdnr
LEFT JOIN kunden_verbaende ON kunden_verbaende.kunden_pKey=3Dkunden.pKey
WHERE (plz=3D$plzstr) AND (umsaetze.kdnr!=3D '0')
GROUP BY verband_kurz

Was mache ich falsch?

Danke,
Christoph

Re: JOIN dauert Minuten?!??!?

am 29.03.2006 17:00:02 von theonly.mcseven

Oh, scheint die falsche Group zu sein. Ich poste nochmal in dcdm.

Re: JOIN dauert Minuten?!??!?

am 29.03.2006 17:00:20 von Niels Braczek

theonly.mcseven@gmx.net schrieb:
^^^^^^^^^^^^^^^^^^^^^^^
Hier wird dein Realname erwartet.

> Herrje, ich bin am Verzweifeln. Ich habe drei Tabellen:
> kunden, kunden_verbaende und umsaetze
> ~7500 ~8500 ~6000 Einträge

Das ist ja gar nichts.

> Wenn ich nun an die Kundentabelle per JOIN die
> Kundenverbände dranhänge dauert das Minuten;
> Obwohl das Kriterium (kunden.pKey) ein 7stelliger
> INT ist.
> Noch schlimmer wird es, wenn ich an das Gebilde
> noch die Umsätze dranklatsche. Dann muß ich den
> Rechner neustarten, weil er hängenbleibt.

Setze Indexe auf die Spalten, mittels derer selektiert wird.

> Und das komische, selbst wenn ich zb mit WHERE
> (plz LIKE '8%') den Zielkreis einschränke, gehts nicht
> merkbar schneller. HIer mal die ganze Abfrage:

plz ist also ein String?

> SELECT count(DISTINCT name1) AS anzahl, 'Alle' FROM kunden
> LEFT JOIN umsaetze ON umsaetze.kdnr=kunden.kdnr
> WHERE (plz=$plzstr) AND (umsaetze.kdnr!= '0')
> UNION
> SELECT count(DISTINCT name1) AS anzahl, verband_kurz FROM kunden
> LEFT JOIN umsaetze ON umsaetze.kdnr=kunden.kdnr
> LEFT JOIN kunden_verbaende ON kunden_verbaende.kunden_pKey=kunden.pKey
> WHERE (plz=$plzstr) AND (umsaetze.kdnr!= '0')
> GROUP BY verband_kurz
>
> Was mache ich falsch?

Zumindest fehlt dir eine Fehlerbehandlung[1]. $plzstr muss gequotet werden.

$sql = "SELECT count(DISTINCT name1) AS anzahl,
'Alle' AS verband
FROM kunden
LEFT JOIN umsaetze ON umsaetze.kdnr=kunden.kdnr
WHERE kunden.plz='{$plzstr}' AND umsaetze.kdnr!=0
UNION SELECT count(DISTINCT name1) AS anzahl,
verband_kurz AS verband
FROM kunden
LEFT JOIN umsaetze ON umsaetze.kdnr=kunden.kdnr
LEFT JOIN kunden_verbaende ON kunden_verbaende.kunden_pKey=kunden.pKey
WHERE kunden.plz='{$plzstr}' AND umsaetze.kdnr!=0
GROUP BY verband";

$result = mysql_query($sql) or die($sql.'
'.mysql_error());
?>

Du brauchst zumindest je einen Index auf kunden.kdnr, kunden.name1,
kunden.plz, kunden.pKey, umsaetze.kdnr und kunden_verbaende.kunden_pKey.

[1] Womit das Thema hier OnTopic wäre; reine Datenbankfragen gehören
nach de.comp.datenbanken.*

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
------------------------------------------------------------ ----

Re: JOIN dauert Minuten?!??!?

am 29.03.2006 17:13:37 von theonly.mcseven

Hi Niels,
vorneweg: Das mit den Indizes wars. Jetzt tuts, wie's soll.
Dankeschön.

Und Fehlerbehandlung & Quoting: Ja, ist mir klar und hab ich drin,
wollte
das nur der Übersichtlichkeit halber nicht hier reinpacken.
Und MySQL wirft ja eh einen Fehler, wenn das Quoting nicht paßt.

Und Realname: Ich benutze grad das Google-Teil, weil der Newsserver
down ist, darum hab ich keinen. Hab keine Ahnung, wie man den hier
reinbaut. Aber wenn der Newsserver wieder geht, hab ich auch einen
Realname ^^

Danke nochmal,
Christoph