Warum ist diese SQL-Anweisung sehr langsam?

8

Ich habe eine Tabelle mit ungefähr 1 Million Datensätzen (mit SQL Server 2008 Web). Ich habe eine Suchroutine, die versucht, auf Produktcode sowie Produktbeschreibung zu entsprechen. In manchen Fällen ist es jedoch sehr langsam. Unten ist (cut-down) SQL-Anweisung:

%Vor%

Beachten Sie, dass wenn ich nur auf [p.BaseSku = 'KPK-3020QWC-C'] oder [ENTHÄLT (p.FreeTextStrings, '"KPK-3020QWC *"']] einzeln (aber nicht beides) sofort vergleichen. Und wenn ich sie miteinander vergleiche, dauert es ewig (mehrere Minuten) - und es wird nur eine Zeile zurückgegeben.

IsEnabled und BaseSku sind indiziert und FreeTextStrings ist FTS-indiziert.

Ich erinnere mich, dass das schon gut funktioniert hat.

Kann irgendjemand etwas dazu sagen und einige Lösungen vorschlagen?

Die Ausführungsplandatei ist hier verfügbar: Ссылка

    
Muxa 18.08.2009, 05:32
quelle

3 Antworten

10

or ist auf SQL Server notorisch langsam. Es ist erschwerend, um es milde auszudrücken.

Versuchen Sie, es in zwei Abfragen mit einem union :

aufzuteilen %Vor%     
Eric 18.08.2009, 05:40
quelle
1

Das scheint gut zu funktionieren:

%Vor%

(Ich hatte bereits BaseSku FTS-indiziert)

    
Muxa 18.08.2009 06:28
quelle
0

Make sure all necessary indexes are in place. Ich hatte das gleiche Problem mit einer or -Klausel in einer meiner Abfragen und die Erstellung eines NONCLUSTERED INDEX mit INCLUDE-Spalten hat die Leistung korrigiert.

Nach weiteren Tests war es der INCLUDE-Spalten Teil des Index, der das Leistungsproblem wirklich behob . Hier ist, was ich getan habe, um das Problem zu ermitteln und zu beheben:

Verwenden Sie den Ausführungsplan, um die fehlenden Indizes zu erstellen:

Ohne den Index benötigte die Abfrage 2+ Minuten, wenn sie in ein paar Millisekunden hätte laufen sollen. Also habe ich die Ausführungspläne der Abfrage mit und ohne die or -Klausel in SSMS verglichen und es war nicht offensichtlich, was ich tun musste (hauptsächlich aufgrund meines mangelnden Verständnisses der Ausführungspläne).

Wenn Sie jedoch über den Ausführungsplan in grünem Text schauen, kann SSMS Ihnen sagen, dass Sie einen Nonclustered-Index erstellen sollen. Hmm ... einen Versuch wert. Also habe ich den Index erstellt und das Problem gelöst! Sie können mit der rechten Maustaste auf die Abfrage "CREATE INDEX" klicken und "Fehlende Indexdetails ..." auswählen. Dies öffnet eine neue Registerkarte mit der vollständigen Abfrage für Sie ausgeführt werden. Gib ihm einen Namen.

    
goku_da_master 16.11.2012 17:27
quelle

Tags und Links