Warum machen die mehrere WHERE-Bedingungen langsame Abfragen anstatt zu beschleunigen?

Das problem ist, dass die Abfrage läuft sehr langsam, wenn im Vergleich zu der Abfrage laufen mit ein oder zwei, anstatt alle drei Bedingungen.

Nun die Abfrage.

Select Count(*)
From 
    SearchTable 
Where 
    [Date] >= '8/1/2009' 
    AND 
    [Zip] In (Select ZipCode from dbo.ZipCodesForRadius('30348', 150))
    AND 
    FreeText([Description], 'keyword list here')  

Die erste Bedingung ist selbsterklärend. Die zweite benutzt eine UDF, um eine Liste der Postleitzahlen, die innerhalb von 150 Meilen von 30348. Die Dritte verwendet einen Volltext-index, um die Suche für die zur Verfügung gestellten Worte.

Nur mit dieser Bedingung

[Date] >= '8/1/2009' 

Die Abfrage 43884 (Tabelle Größe ist knapp 500k Zeilen) in 3 Sekunden.

Nur mithilfe dieser Zustand

[Zip] In (Select ZipCode from dbo.ZipCodesForRadius('30348', 150))

Bekomme ich 27920, auch wieder in 3 Sekunden.

Und mit nur der vollständige text ist Teil

FreeText([Description], 'keyword list here')

68404 ist wieder in 8 Sekunden.

Wenn ich nur die Postleitzahl und der Volltext-Bedingungen, die ich bekommen 4919 in 4 Sekunden.
Nur das Datum und den vollständigen text der Bedingungen ruft, die mich 9481 in nur schüchtern von 14 Sekunden.
Mit dem Datum und der Postleitzahl Bedingungen nur gibt mir 3238 in 14 Sekunden.
Mit allen drei Bedingungen, die von der Abfrage zurückgegeben 723 in 2 Minuten, 53 Sekunden. (wtfbbq)

Da dauert es eine volle 3 Sekunden zu zählen, das Feld "Datum", Frage ich mich, ob es irgendwelche Indizes, die auf diese Spalten?
3 Sekunden ist eine LANGE Zeit für nur 500k Zeilen. Indizes sind definitiv fehlen
Wünschte, ich könnte wurden ausgezeichnet: die Antwort auf mehr als eine person, denn viele waren hilfreich. Showplan ergab, dass die UDF war auf jeden Fall das Problem. wenn ich dump die Ergebnisse in eine temp-Tabelle und die join, bekomme ich mein Ergebnis in 0 Sekunden... SIEG!!... Dank Stack-Überlauf homies..
Clark: ich hatte das gleiche problem... und durch die übergabe mit einer temp-Tabelle funktioniert es wie ein Charme. Thx

InformationsquelleAutor Clark | 2010-01-29

Schreibe einen Kommentar