php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-09-2009, 19:39
micromumpitz
 Registrierter Benutzer
Links : Onlinestatus : micromumpitz ist offline
Registriert seit: Aug 2009
Beiträge: 9
micromumpitz befindet sich auf einem aufstrebenden Ast
Standard Optimierung für Abfragen mit JOIN

Hallo,

nachdem mir hier in letzter Zeit mehrere ganz hervorragende Tipps gegeben worden sind , möchte ich euch noch mal mit 2 Fragen behelligen, von denen ich hoffe, dass mir jemand dabei helfen kann.

Teilfrage 1
Angenommen ich habe zwei Tabellen wie die folgenden:

Nun möchte ich die Anzahl der Sachen abfragen, die das Datum 02.05.2009 tragen und die einer Kategorie zugeordnet sind, die als "essbar" eingestuft ist. Dazu verwende ich die folgende Abfrage, die auch wunschgemäß funktioniert:
Code:
SELECT COUNT(s.katid) FROM sachen s
JOIN (SELECT katid, essbar FROM kategs) AS k
ON k.katid=s.katid
WHERE DAY(s.datum)= '2' AND MONTH(s.datum)='5' AND YEAR(s.datum)='2009' AND k.essbar='1'
Allerdings habe ich den Eindruck, dass die Abfrage in Anbetracht einer recht geringen Datenmenge in den Tabellen ziemlich lange dauert. Gäbe es da vielleicht Möglichkeiten zur Optimierung? s.datum ist übrigens vom Typ DATETIME und speichert neben dem Datum auch noch eine Uhrzeit, die für diese Abfrage aber nicht von Bedeutung ist. Es geht hier nur um den Tag, daher die umständliche Schreibweise mit DAY(...) usw. k.essbar ist vom Typ TINYINT und entweder 0 oder 1.

Teilfrage 2
Neben dieser Abfrage habe ich noch eine zweite, bei der der Optimierungsbedarf noch größer zu sein scheint. Die Ausführung der Abfrage dauert rund 30 Sekunden, obwohl der PC gar nicht mal langsam ist und das würde ich gerne noch schneller hinbekommen.
Die Tabellen sind wieder die gleichen wie oben, nur dass hier noch eine dritte dazukommt:

In diesem Fall möchte ich gerne abfragen, wie viele Sachen am 02.05.2009 gegessen worden sind, die nicht essbar waren... ^^
Dazu verwende ich bisher die folgende Abfrage:
Code:
SELECT COUNT(*) FROM verputzt v
WHERE DAY(v.datum)= '2' AND MONTH(v.datum)='5' AND YEAR(v.datum)='2009'
AND v.sachid IN
 (SELECT s.sachid FROM sachen s
   JOIN (SELECT katid, essbar FROM kategs) AS k
   ON k.katid=s.katid
   WHERE k.essbar='0'
 )
Ich glaube das Problem ist, dass für jeden Datensatz der Tabelle verputzt die Unterabfrage nach dem IN ausgeführt wird oder? Das wäre ja eigentlich nur 1x nötig. :-?

Gruß und danke schon im Voraus!
MicroMumpitz
Mit Zitat antworten
  #2 (permalink)  
Alt 10-09-2009, 19:44
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

Joins auf Subselects sind auch eher nicht so optimal, weil MySQL damit gezwungen wird, den Subselect ohne Hinblick auf den Kontext und damit ohne Optimierungsmöglichkeiten abzuhandeln, das Ergebnis zwischenzuspeichern und dann erst zu joinen. Wenn du sowieso ein konkretes Datum prüfst, warum dann nicht gleich komplett, sondern in Teilstücken?

Teilfrage 1:
Code:
SELECT COUNT(*) FROM sachen AS s
JOIN kategs AS k ON k.katid=s.katid
WHERE s.datum = '2009-05-02' AND k.essbar='1'
(nicht getestet)

Teilfrage 2:
Code:
SELECT COUNT(*) FROM verputzt AS v
JOIN sachen AS s ON s.sachid=v.sachid
JOIN kategs AS k ON k.katid=s.katid
WHERE v.datum = '2009-05-02' AND k.essbar='0'
(nicht getestet)

Gruß,

Anja

Geändert von AmicaNoctis (10-09-2009 um 19:50 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 10-09-2009, 20:13
micromumpitz
 Registrierter Benutzer
Links : Onlinestatus : micromumpitz ist offline
Registriert seit: Aug 2009
Beiträge: 9
micromumpitz befindet sich auf einem aufstrebenden Ast
Standard

Hallo Anja,

vielen Dank für die äußerst schnelle und hilfreiche Antwort!

Zitat:
Zitat von AmicaNoctis
Wenn du sowieso ein konkretes Datum prüfst, warum dann nicht gleich komplett, sondern in Teilstücken?
Stimmt, ich könnte statt der einzelnen Überprüfung von DAY, MONTH und YEAR auch mit DATE(...) den Datumsteil aus den DATETIME-Spalten extrahieren. Damit lässt sich vielleicht auch noch mal Zeit gewinnen.

Es funktioniert übrigens - obwohl ungetestet - perfekt! Danke nochmals!

Gruß,
MicroMumpitz
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Join oder 2 getrennte Abfragen? seekworld SQL / Datenbanken 2 25-05-2006 17:24
user daten per join abfragen und gleichzeitig black/whitelist abfragen? westberlin SQL / Datenbanken 10 07-12-2005 16:32
Join Abfragen Günni SQL / Datenbanken 4 14-04-2003 10:15
Join 2Tabellen or Abfragen! tomtherock SQL / Datenbanken 7 13-01-2003 10:57
optimierung von abfragen printf SQL / Datenbanken 1 21-03-2002 10:05

Themen-Optionen
Thema bewerten
Thema bewerten:

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:00 Uhr.