phpbar.de logo

Mailinglisten-Archive

Merkwürdiges Verhalten by GROUP BY

Merkwürdiges Verhalten by GROUP BY

Sebastian Mendel lists at sebastianmendel.de
Fre Okt 22 12:42:54 CEST 2004


Andreas Müller wrote:
> Hallo zusammen,
> mir ist gestern ein sehr merkwürdiges verhalten beim GROUP BY aufgefallen.
> Btw. es handelt sich um Version 4.0.18 unter Win32.
> 
> Folgende Query wird ausgeführt:
> 
> select wv.ktypnr ktypnr,wp1.nr HA_nr,wp1.shortdescription
> HA_text,d.shortname VA,wp2.nr VA_nr,wp2.shortdescription VA_text
> from workassociation wa
> left join direction d on d.direction_id=wa.direction_id
> left join workvalue wv on wa.workvalue_id=wv.workvalue_id
> left join workprocess wp1 on wp1.workprocess_id=wv.workprocess_id
> left join workprocess wp2 on wp2.workprocess_id=wa.workprocess_id
> group by wa.workvalue_id,wa.workprocess_id,wa.direction_id
> having count(wa.workassociation_id)>1
> 
> workassociation: 22.000.000 Datensätze
> direction: 4 Datensätze
> workvalue: 15.800.000 Datensätze
> workprocess: 27.000 Datensätze
> 
> Zum Datenmodell muss man sagen das immer Tabellenname_ID der PK ist. Wie man
> einfach sehen kann ist das ganze ein Fulltabelscan über die workassociation
> mit einem GROUP BY. Nebenbei werden paar Infos dazugejoint die aber nur
> lookups sind da gegen PK der gejointen tabelle. So zeigt es auch explain.
> 
> Was nun passiert ist ein table handler error 26 - sprich - out of diskspace.
> Nun ist auf der Maschine Platz genug (rund 10 GB). Also habe ich mal
> beobachtet wie die Temp-Tabelle bei der Query wächst. Wenn ich mit meinen
> Berechnungen nicht danebenliege scheint der aus VARCHAR Spalten CHAR Spalten
> zu machen und damit die Temp-Tabelle sinnlos aufzublasen. Kann das sein ?
> 
> zur Info:
> wp1.nr - varchar(10)
> wp1.shortdescription - varchar(255)
> d.shortname - char(1)
> wp2.nr - varchar(10)
> wp2.shortdescription - varchar(255)
> 
> Nach durchschnittlichen Datenmengen müssten bei Varchar-Feldern hier rund 3
> GB Daten entstehen da die durchschnittlichen Länge in den Shortdescriptions
> bei 37 liegt.
> 145 Byte * 22.000.000 = 3 GB
> 
> Hat irgendjemand ne Idee ob ich mit meiner Vermutung richtig liege? Und wenn
> ja warum macht MySQL das so "blöd"? 

Also warum MySQL das so macht weiß ich nicht, wahrscheinlich muss es so.

'26' heißt vielleicht auch das die Datei nicht größer als 2GB werden 
kann (Windows?)?

Aber was ich nicht verstehe ist der Sinn dieser Abfrage? Wenn ich deine 
Struktur richtig verstanden habe kommen da eh immer 0 Datensätze raus 
... oder?

Davon ausgehend das [Tabelle].[Tabelle]_id immer PK und 
[Tabelle].[andere Tabelle]_id immer FK sind.


-- 
Sebastian Mendel

www.sebastianmendel.de www.warzonez.de www.tekkno4u.de www.nofetish.com
www.sf.net/projects/phpdatetime        www.sf.net/projects/phptimesheet

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive