Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Abfrage dauert über eine Minute [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Abfrage dauert über eine Minute


 
otto-mueller
15-03-2004, 23:12 
 
Hallo allerseits,

ich versuche aus drei Tabellen Daten per Inner Join und Outer Join zu holen. Es werden zwar die richtigen Daten geholt, aber es dauert über eine Minute.

Hier meine Abfrag:SELECT HSLFN, HSTKN, HSDAT, HSVON, HSBIS, HSERR, HSFIX, FCFILE.FC011, TKDMAT.MALFN
FROM TKDHST INNER JOIN FCFILE
ON TKDHST.HSERR = FCFILE.FC009
LEFT OUTER JOIN TKDMAT ON TKDHST.HSLFN = TKDMAT.MALFN
WHERE TKDHST.HSFNR = '$DLRVAR' AND TKDHST.HSVBN = '$VBNVAR'
AND TKDHST.HSGID = '$KDGIDVAR'
AND FCFILE.FC006 = 'TKD' AND FCFILE.FC007 = '$DLRVAR'
AND FCFILE.FC008 = '060'
ORDER BY HSDAT DESCDie Variablen in der Abfrage werden natürlich vorher als Wert übergeben.
Zu der Abfrag:
Hier werden aus folgenden 3 Tabellen Daten zusammengestellt:
- TKDHST: Daten über technische Einsätze
- FCFILE: Fehlercode-Tabelle mit Fehlerbeschreibung
- TKDMAT: Materialverbrauch-Tabelle für jeden Einsatz aus der Tabelle TKDHST
Ich möchte aus der TKDHST mit der Bediengung TKDHST.HSGID = '$KDGIDVAR' die entsprechenden Felder (s. Abfrage) ausgeben dazu soll außerdem über die Beziehung TKDHST.HSERR = FCFILE.FC009 die Fehlerbeschreibung FCFILE.FC011 aus der Tabelle FCFILE geholt werden. Als letztes Datensatzfeld noch den TKDMAT.MALFN über die Beziehung TKDHST.HSLFN = TKDMAT.MALFN ausgeben.

Hat jemand vielleicht eine bessere Alternative für meine Abfrage, die nicht allzu lange braucht?

Als Anlage die 3 Tabellen in Code-Form!

Vielen Dank vorab

Gruß

OttoHää? Wo bleibt denn mein Datei-Anhang? Naja... wenn jamand möchte, dann schicke ich sie ihm per Mail

 
toshi
15-03-2004, 23:30 
 
Hi,

also ich hätte das wohl so gemacht:

SELECT
TKDHST.HSLFN, TKDHST.HSTKN, TKDHST.HSDAT, TKDHST.HSVON, TKDHST.HSBIS,
TKDHST.HSERR, TKDHST.HSFIX, FCFILE.FC011, TKDMAT.MALFN
FROM TKDHST
LEFT JOIN FCFILE ON TKDHST.HSERR = FCFILE.FC009
LEFT JOIN TKDMAT ON TKDHST.HSLFN = TKDMAT.MALFN
WHERE TKDHST.HSFNR = '$DLRVAR'
AND TKDHST.HSVBN = '$VBNVAR'
AND TKDHST.HSGID = '$KDGIDVAR'
AND FCFILE.FC006 = 'TKD'
AND FCFILE.FC007 = '$DLRVAR'
AND FCFILE.FC008 = '060'
ORDER BY HSDAT DESC



und dann auf jeden Fall den Index auf die Tabellenfelder setzen, nach denen gesucht/sortiert wird:
TKDHST.HSFNR , TKDHST.HSGID , FCFILE.FC006 , FCFILE.FC007 , FCFILE.FC008 , FCFILE.FC009 , TKDMAT.MALFN

 
otto-mueller
18-03-2004, 11:54 
 
Hallo,

danke erstmal für die schnelle Antwort.

Ich sehe eigentlich keinen großen Unterschied zwischen meiner und deiner Version bis auf den "LEFT JOIN" in deiner Version. Das war aber nicht die Absicht!!! Es muß schon INNER JOIN und nicht OUTER JOIN sein.

Die Felder sind indiziert.

Ich habe was anderes probiert und zwar den Teil:LEFT OUTER JOIN TKDMAT ON TKDHST.HSLFN = TKDMAT.MALFN weggelassen und wurde die Abfrage sogar unter einer Sekunde ausgeführt. - Also die 3. Tabelle macht probleme (TKDMAT.MALFN ist auch indiziert!).

Hat jemand eine andere Idee?

Danke vorab

Gruß
Otto

 
goth
18-03-2004, 12:31 
 
Führ' mal ein DESCRIBE über das Statement aus (DESCRIBE selectstatement) ... um zu prüfen ob die indizes auf verwendet werden ...

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:13 Uhr.