phpbar.de logo

Mailinglisten-Archive

Re: Joins / Performance
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Joins / Performance



On Thu, 19 Aug 1999 14:47:39 +0200, Martin Ramsch wrote:

>Der Artikel ist in dieser Form - ohne Bezug zu einem konkreten DBMS -
>sehr irreführend, denn ob bei der Ausführung der vom Ergebnis her
>identischen Anweisungen
>   FROM a, b WHERE a.id=b.id ...
>und
>   FROM a JOIN b ON a.id=b.id WHERE ...
>intern ein Unterschied gemacht wird, hängt rein von der
>Implementierung und evtl. Optimierungen des DBMS ab.

Das dachte ich mir schon.

>> Ziel: Ich will die personenanzahl aller orte, in denen die personen
>> keiner niederlassung angehören. Dazu habe ich folgendes statement:
>> 
>> select distinct(a.ort), count(a.id) as anzahl 
>>   from person a, 
>>        rel_niederlassung_person b 
>>  where a.id != b.person_id 
>>  group by ort 
>>  order by ort
>
>Vorbemerkung:
>   DISTINCT(ort), ... tut etwas anderes, als Du vermutlich willst
>   (schließe ich aus der Klammernsetzung), denn
>     SELECT DISTINCT ... FROM
>   bedeutet (zumindest in MySQL), daß die Ergebnistupel gesamt (also
>   alle Ergebnisfelder als ein Wert zusammengenommen) unterschiedlich
>   sein müssen (die Klammern um a.ort sind für MySQL hier also kein
>   Teil von DISTINCT, sondern einfach unnötige, aber auch nicht
>   störende Klammern um a.ort). Somit wären (Passau, 5) und (Passau,
>   6) mögliche Ergebnisse.  In Deinem Beispiel kann aber aufgrund des
>   GROUP BY eh kein doppelter Ort vorkommen, weshalb Du das so nicht
>   bemerken wirst.

Ok, die klammern sind also überflüssig. Das kommt davon, wenn man
nicht zuviel in der doku liest ;)) 

>Zur SQL-Anfrage selbst:
>   Das funktioniert wirklich so?  Kann ich nicht recht glauben ...
>
>   Wenn ich das richtig verstehe, wird doch so pro Ort und pro Person
>   dieses Ortes jede andere in der Tabelle "rel_niederlassung_person"
>   vorkommende Person gezählt!

Wenn ich "where a.id != b.person.id" benutze? Dann werden IMO alle
records selektiert, deren id aus tabelle a _nicht_ der person_id der
tabelle b entspricht. Genau das will ich ja.

>   Das ist nicht, was Du oben als Ziel angibst!

Klarer formuliert: Ich will die anzahl aller personen zu jedem ort,
für alle personen, die nicht einer niederlassung angehören.

>   Mein Lösungsvorschlag:
>
>   SELECT a.ort, COUNT(*) AS anzahl
>   FROM person AS a LEFT JOIN rel_niederlassung_person AS b
>        ON a.id = b.id
>   WHERE b.id IS NULL
>   GROUP BY a.ort;

Ist das gleiche ergebnis, nur ein paar 1/100 sek. langsamer als
"where a.id != b.person_id". Momentan habe ich noch 4000 datensätze
in der tabelle person, wird aber stark ansteigen (ca. 250.000).
Daher ist gute performance extrem wichtig.

>   Oder wolltest Du nur die Orte, wo keine Person einer Niederlassung
>   angehört (plus die Anzahl dieser Leute)?  Dann das hier:

Nein. 

Danke für die ausführliche antwort.

ciao

amalesh
-- 
Anwendungsentwicklung mit C++ JAVA VB PHP ASP SQL POET SGML XML
http://www.living-source.com ~ ak_(at)_living-source.com ~ icq963380
Hamburg : Tel. 040-39904183 Fax. 040-39904328 Mob. 0170-4809618
Freiburg: Tel. 0761-152580  Fax. 0761-1525850

---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive