Ich habe eine Tabelle mit etwa 1 Million Datensätze (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. Im Folgenden finden Sie (cut-down) SQL-Anweisung:Warum ist diese SQL-Anweisung sehr langsam?
WITH AllProducts AS (
SELECT p.*, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
FROM Product AS p
WHERE p.IsEnabled=1 AND
(
p.BaseSku = 'KPK-3020QWC-C' -- this on its own is fast
OR
CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"') -- and this on its own is fast, but not both
)
) SELECT * FROM AllProducts
WHERE RowNumber BETWEEN 1 AND 20;
Beachten Sie, dass, wenn ich nur miteinander vergleichen [p.BaseSku = 'KPK-3020QWC-C'] oder [ENTHÄLT (p.FreeTextStrings ‚", KPK-3020QWC * "')] individuell (aber nicht beides) sein Moment. Und wenn ich sie miteinander vergleiche, dauert es ewig (mehrere Minuten) - und es gibt nur eine Zeile.
IsEnabled und BaseSku sind indiziert und FreeTextStrings ist FTS-indiziert.
Ich erinnere mich, dass dies funktionierend war.
Kann jemand etwas Licht darauf werfen und einige Lösungen vorschlagen?
Ausführungsplan-Datei finden Sie hier: http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip
Können Sie uns einen Ausführungsplan von Ihrem SQL Server zeigen? –
Diese Probleme traten nach der Aktualisierung von SQL 2005 auf SQL 2008 auf. – Muxa