CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
19.10.2010, 15:01:10
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
|
|
AW: Left Join auf Select
hier ist der Explain, ich hab grade mal einen Index hinzugefügt, aber der wird nicht wirklich verwendet.
Code:
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
| 1 | PRIMARY | tempMZ | ALL | IndexIDAdresseVEVeWeTblMieterZuordnung | NULL | NULL | NULL | 7766 | Using where |
| 1 | PRIMARY | tempA | eq_ref | PRIMARY,indexIdAdresse,indexidAdressetblAdresse | PRIMARY | 4 | wvs_wws_beta.tempMZ.idAdresse | 1 | |
| 2 | DEPENDENT SUBQUERY | temp | ref | indexVetblmieterzurodnung,indexWetblMieterzurordnung,IndexVeWeLaufnrTblMieterZuordnung | IndexVeWeLaufnrTblMieterZuordnung | 10 | wvs_wws_beta.tempMZ.ve,wvs_wws_beta.tempMZ.we | 2 | Using where |
+----+--------------------+--------+--------+----------------------------------------------------------------------------------------+-----------------------------------+---------+-----------------------------------------------+------+-------------+
|
19.10.2010, 15:17:33
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Left Join auf Select
Der EXPLAIN zeigt, dass die Tabelle tempMZ komplett durchsucht wird. Das dauert natürlich etwas länger.
Generell: Wird ein Index nicht verwendet, dann bitte wieder entfernen.
Ich habe den SUB-Select mal umgeschrieben und hoffe er stimmt so..
Code:
SELECT tempmz.ve,
tempmz.we,
tempmz.kuendigungsdatum,
tempmz.kuendigungsgrund,
Concat(tempa.nachname, ", ", tempa.vorname) AS name,
tempa.tel
FROM tblmieterzuordnung tempmz
JOIN tbladresse tempa
ON tempmz.idadresse = tempa.idadresse
JOIN (SELECT ve, we, Max(TEMP.vertragsende) AS max_vertragsende
FROM tblmieterzuordnung
WHERE vertragsende <> '1800-01-01'
GROUP BY ve, we
ORDER BY NULL ) temp
ON temp.ve = tempmz.ve
AND temp.we = tempmz.we
AND temp.max_vertragsende = tempmz.vertragsende;
Wie sieht denn hiermit der EXPLAIN aus?
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
19.10.2010, 15:29:33
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
|
|
AW: Left Join auf Select
Jap die Daten passen so, hier der Explain:
Code:
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2196 | |
| 1 | PRIMARY | tempmz | ref | indexVetblmieterzurodnung,indexWetblMieterzurordnung,IndexVeWeLaufnrTblMieterZuordnung,IndexIDAdresseVEVeWeTblMieterZuordnung | IndexVeWeLaufnrTblMieterZuordnung | 10 | temp.ve,temp.we | 2 | Using where |
| 1 | PRIMARY | tempa | eq_ref | PRIMARY,indexIdAdresse,indexidAdressetblAdresse | PRIMARY | 4 | wvs_wws_beta.tempmz.idAdresse | 1 | |
| 2 | DERIVED | tblMieterZuordnung | index | NULL | IndexIDAdresseVEVeWeTblMieterZuordnung | 24 | NULL | 7766 | Using where; Using index; Using temporary |
+----+-------------+--------------------+--------+-------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+---------+-------------------------------+------+-------------------------------------------+
|
19.10.2010, 15:40:13
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Left Join auf Select
Okay, aus meiner Sicht sollte der SUB-Select dann so schneller sein. Baue doch mal diesen SUB-Select für Vor- und Nachmieter entsprechend dem Beispiel um und in den Gesamt-Select ein.
Weiterhin fällt mir auf, das nirgend eine "echte" WHERE Klausel besteht. D.h. die Abfrage geht immer über den gesamten Datenbestand. Das ist vermutlich nicht realistisch.
Entsprechende "echte" WHERE Bedingungen sollten dann nicht nur im Gesamt-SELECT, sondern - wenn möglich - auch in den SUB-Select eingetragen werden. Damit die SUB-Select so wenig Daten wie möglich liefern.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
19.10.2010, 16:03:00
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
|
|
AW: Left Join auf Select
Der Gesamt Select ist nun etwa 200ms schneller, wenn ich weitere spalten ausgeben lasse schnellt es aber wieder in die Höhe.
Zitat:
Weiterhin fällt mir auf, das nirgend eine "echte" WHERE Klausel besteht. D.h. die Abfrage geht immer über den gesamten Datenbestand. Das ist vermutlich nicht realistisch.
|
Genau, sie sollen aber nur über die ~360 Wohnungen aus dem ersten Select gehen, aber wie kann ich das realisieren?
Gruß
|
19.10.2010, 18:36:10
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Left Join auf Select
Zitat:
Zitat von nagel
Der Gesamt Select ist nun etwa 200ms schneller, wenn ich weitere spalten ausgeben lasse schnellt es aber wieder in die Höhe.
|
Je mehr Daten der SQL liefert, desto mehr Bytes müssen auch gelesen und transportiert werden. Also sollte die SELECT-Liste keine unnötigen Spalten enthalten.
Allgemein:
Wenn eine Tabelle z.B. 100 Datensätze hat und bei einem "SELECT * FROM " z.B. 80 davon gelesen werden, ist der Zugriff ohne Index schneller als mit. Da hat jede Datenbank so seine eigenen Grenzwerte.
Zitat:
Zitat von nagel
Genau, sie sollen aber nur über die ~360 Wohnungen aus dem ersten Select gehen, aber wie kann ich das realisieren?
Gruß
|
Was für "Wohnungen" sollen denn angezeigt werden? Irgendwelche Kriterien müssen ja zu finden sein. Beispielweise eine Bereichssuche nach Postleitzahl wäre sinnvoll.
Code:
..
WHERE plz BETWEEN 60000 AND 65000 ..
..
Bin noch am überlegen, was man noch schneller machen könnte.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
20.10.2010, 14:57:22
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
|
|
AW: Left Join auf Select
Zitat:
Was für "Wohnungen" sollen denn angezeigt werden? Irgendwelche Kriterien müssen ja zu finden sein. Beispielweise eine Bereichssuche nach Postleitzahl wäre sinnvoll.
|
Der Select mit den Kriterien für die Wohnung stehen ja oben (ich glaub grade ich habe generell einen Fehler im Aufbau des Selects? )
Code:
(
SELECT W.idWohnung, MZ.idZuordnung,MZ.idAdresse,W.ve,W.we
FROM (tblWohnung W LEFT JOIN tblMieterZuordnung MZ ON W.ve = MZ.ve AND W.we = MZ.we)
WHERE
(MZ.Vertragsbeginn =
(SELECT MAX(temp.Vertragsbeginn)
FROM tblMieterZuordnung temp
WHERE temp.ve = W.ve AND temp.we = W.we)
OR MZ.Vertragsbeginn IS NULL)
AND
((MZ.Vertragsende <> '1800-01-01' AND MZ.Vertragsende < NOW()) OR MZ.Vertragsbeginn IS NULL OR (MZ.Vertragsende = '1800-01-01' AND MZ.Vertragsbeginn > NOW()))
AND W.Altbestand = false
AND W.del = false
GROUP BY W.idWohnung
)
ich will ALLE Wohnungen und damit zusammenhängende Daten(tblAdresse,tblMieterZuordnung...) welche auf die Kriterien in diesem Select zutreffen.
Gruß
|
20.10.2010, 15:25:00
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Left Join auf Select
Zitat:
Zitat von nagel
Der Select mit den Kriterien für die Wohnung stehen ja oben (ich glaub grade ich habe generell einen Fehler im Aufbau des Selects? )
ich will ALLE Wohnungen und damit zusammenhängende Daten(tblAdresse,tblMieterZuordnung...) welche auf die Kriterien in diesem Select zutreffen.
|
Ob der SQL "sinnvoll" ist kann ich aufgrund der Datenmenge (siehe Deine #1 Mail mit dem Datenvolumen) und der Komplexität aus der Entfernung nicht entscheiden. Ich denke, dass sprengt die Möglichkeiten eines freiwilligen und kostenlosen Forums wie diesem hier.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
21.10.2010, 09:27:02
|
Anfänger
|
|
Registriert seit: Oct 2010
Alter: 34
Beiträge: 15
|
|
AW: Left Join auf Select
Ja stimmt wohl, aber nochmal danke für deine Hilfe;)
Aber einmal noch um ganz sicher zu gehn:
Es ist nicht möglich in z.b.
Code:
SELECT *
FROM (Select ID FROM Tabelle WHERE ....) as Basis
LEFT JOIN (SELECT * FROM Tabelle2 WHERE....)
LEFT JOIN (SELECT * FROM Tabelle3 WHERE....)
Im zweiten und dritten Select nur die ID´s vom ersten Select zu nehmen?
Ich kann im WHERE des zweiten und dritten Selects ja nicht sagen "WHERE ID = Basis.ID".
Gibt es keine andere möglichkeit? Das würde das ganze problem glaub ich lösen.
Gruß
|
21.10.2010, 10:21:22
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: Left Join auf Select
Anstatt
Code:
SELECT *
FROM (Select ID FROM Tabelle WHERE ....) as Basis
LEFT JOIN (SELECT * FROM Tabelle2 WHERE....)
LEFT JOIN (SELECT * FROM Tabelle3 WHERE....)
kannst Du ja mal so etwas probieren. Dann können die Werte aus der Basistabelle
als Grundlage für die weitere Suche herangezogen werden.
Code:
SELECT *
FROM (SELECT *
FROM Tabelle2 t2
JOIN (Select ID FROM Tabelle WHERE ....) as Basis
ON t2.ID = Basis.ID) q1
LEFT JOIN (SELECT *
FROM Tabelle3 t3
JOIN (Select ID FROM Tabelle WHERE ....) as Basis
ON t3.ID = Basis.ID) q2
ON q2.xyz = q1.xyz
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 18:43:50 Uhr.
|