2011-01-14 5 views
1

Die fragliche Website funktioniert normalerweise ziemlich gut, aber mit der Zeit wird sie immer langsamer.Abfrage ist langsam, wird schnell nach "dbcc freeproproccache". Könnte es meine Parameter sein?

Wir haben eine riesige Abfrage, um die Produkte, die der Benutzer für die Suche zu finden, und sie sind meist in dieser Form:

WHERE ProductName LIKE @ProductName OR @ProductName IS NULL 
    AND ProductGroup LIKE @ProductGroup or @ProductGroup IS NULL 
    AND (...) 

Auf diese Weise müssen wir alle Parameter nicht passieren, wenn wir suchen sind nur für die Produktnummer. Könnte das der Grund sein, dass die Abfragen langsamer werden? Etwas damit zu tun, dass die Abfrage das erste Mal zwischengespeichert wird, und das nächste Mal, wenn die Parameter geändert wurden, verwendet es den alten Abfrageplan?

Wenn ja; Was wäre der beste Weg, dies zu beheben? Dynamisches SQL?

Antwort

5

Vom kleinen Ausschnitt aus der Abfrage Sie es schwierig, gezeigt hat, ist zu sehen, ob Sie wahrscheinlich einen Parameter Sniffing Problem haben, aber es klingt wie es, wenn Sie plötzlich einen besseren Plan nach der Cache

befreien bekommen Aber das ist generell eine schlechte Art, Anfragen trotzdem zu schreiben. (WHERE [email protected] OR @X IS NULL Art der Abfrage), da dies zu einem unnötigen Scan führt. In diesem Fall spielt es keine Rolle, ob Ihr LIKE einen führenden Platzhalter hat oder nicht.

Aber SQL Server kann die LIKE in eine Bereichssuche auf einem Index sowieso konvertieren, so dass Sie Abfragen ohne einen führenden Platzhalter unnötigerweise bestrafen werden. (Vergleiche zum Beispiel die Pläne für die Abfragen unten)

DECLARE @T nchar(3) 
SET @T='%f' 


SELECT [name] 
    FROM [master].[dbo].[spt_values] 
where type like @T 


SELECT [name] 
    FROM [master].[dbo].[spt_values] 
where type like @T OR @T IS NULL 

Plan

Sie könnten versuchen, diese Fälle oder die Erzeugung der dynamischen Suchbedingungen mit dynamischem SQL zu splitten.

+0

haben Sie einen interessanten Fall vorgestellt. Ich dachte, dass ein führender Platzhalter in einer LIKE-Klausel (z. B. type LIKE '% f') den Index als nutzlos rendert. – peakit

+0

@peakit - Der führende Platzhalter bedeutet, dass die Bereichsuche einen Bereich sucht, der aus dem gesamten Index besteht. Der Vorteil für SQL Server bei der Verwendung einer Bereichssuche im Plan besteht darin, dass der gleiche Plan verwendet werden kann, wenn ein nicht führender Platzhalter vorhanden ist und ein viel engerer Bereich gesucht wird. –

Verwandte Themen