/ / SQL-Abfrage dauert ewig - SQL-Server, Datum / Uhrzeit, Join

Die SQL-Abfrage dauert immer - SQL-Server, Datumszeit, Join

Ich habe dieses Webapplikations-Tool, das Daten abfragt und in einem Raster anzeigt. Jetzt benutzen viele Leute es, also muss es ziemlich performant sein.

Die Sache ist, ich musste ein paar zusätzliche Felder durch Joins hinzufügen, und nun dauert es ewig, bis die Abfrage ausgeführt wird.

Wenn ich in SQL Server die folgende Abfrage ausführen:

select top 100 *
from bam_Prestatie_AllInstances p
join bam_Zending_AllRelationships r on p.ActivityID = r.ReferenceData
join bam_Zending_AllInstances z on r.ActivityID = z.ActivityID
where p.PrestatieZendingOntvangen >= "2010-01-26" and p.PrestatieZendingOntvangen < "2010-01-27"

Dies dauert etwa 35-55 Sekunden, was zu lange dauert. Weil dies nur ein kleiner ist.

Wenn ich eine der beiden Datumsüberprüfungen entferne, dauert es nur 1 Sekunde. Wenn ich die beiden Verbindungen entferne, dauert es ebenfalls nur 1 Sekunde.

Bei Verwendung eines Abfrageplans kann ich feststellen, dass 100% der Zeit für die Indizierung des Felds PrestatieZendingOntvangen aufgewendet wird. Wenn ich dieses Feld für die Indexierung eingestellt habe, ändert sich nichts.

Hat jemand eine Idee, was zu tun ist?

Weil sich meine Kunden über Auszeiten usw. beschweren

Vielen Dank

Antworten:

6 für die Antwort № 1

Neben der offensichtlichen Frage eines Index über die bam_Prestatie_AllInstances.PrestatieZendingOntvangen prüfen, ob Sie Indizes für die Fremdschlüsselspalten haben:

  • p.ActivityID (Tabelle: bam_Prestatie_AllInstances)
  • r.ReferenceData (Tabelle: bam_Zending_AllRelationships)
  • r.ActivityID (Tabelle: bam_Zending_AllRelationships)
  • z.ActivityID (Tabelle: bam_Zending_AllInstance)

Indizieren der Fremdschlüsselfelder kann dazu beitragen, JOINs in diesen Feldern erheblich zu beschleunigen!

Wie bereits erwähnt: Versuchen Sie, die Auswahl der Felder zu beschränken, indem Sie eine bestimmte Feldliste angeben - anstatt sie zu verwenden SELECT * - vor allem wenn Sie mehrere Tische verbinden, nur dieEine schiere Anzahl von Spalten (multipliziert mit der Anzahl von Zeilen, die Sie auswählen) kann zu massiven Datenübertragungen führen.


2 für die Antwort № 2
  1. Geben Sie die Felder an, die Sie abrufen möchten, und nicht *.
  2. Geben Sie entweder Inner Join oder Outer Join an

0 für die Antwort № 3

Versuchen zwischen

where p.PrestatieZendingOntvangen
between "2010-01-26 00:00:00" and "2010-01-27 23:00:00"

0 für die Antwort № 4

Hast du eine Indizes auf den Datumsfeldern in Ihrem Where Klausel.

Wenn nicht, würde ich in diesen Feldern einen INDEX erstellen, um zu sehen, ob es Unterschiede zur Zeit gibt.

Natürlich nehmen Indizes mehr Speicherplatz in Anspruch, sodass Sie die Auswirkungen dieses zusätzlichen Index berücksichtigen müssen.

BEARBEITEN:

Die anderen haben auch gute Punkte gemacht, um anzugeben, welche Spalten Sie in der Select anstelle von * (Platzhalter) und Platzieren weiterer Indizes für Fremdschlüssel usw.


0 für die Antwort № 5

Jemand mit DB-Hintergrund kann meine Zweifel darüber klarstellen.

Ich denke, Sie sollten das Datum in dem Stil angeben, in dem die DB es verstehen kann.
für z.B. Angenommen, das Datum wird im Format mm / tt / jjjj in der Tabelle gespeichert und Ihre Abfrage versucht, einen anderen Datumsstil für den Vergleich anzugeben (jjjj-mm-tt). Die Leistung sinkt.

Bin ich zu naiv, wenn ich davon ausgehe?


0 für die Antwort № 6

Wie viele Spalten haben bam_Prestatie_AllInstances und die anderen Tabellen? Es sieht so aus, als ob Sie alle Spalten ausfüllen und das kann definitiv ein Leistungsproblem sein.

Haben Sie versucht zu wählen bestimmte Spalten aus bestimmten Tabellen wie:

select top 100 p.column1, p.column2, p.column3

Stattdessen alle Spalten abzufragen, wie Sie gerade tun:

select top 100 *