Ich bin auf eine seltsame Situation gestoßen, in der das Anhängen OPTION (RECOMPILE)
an meine Abfrage dazu führt, dass sie in einer halben Sekunde ausgeführt wird. Wenn Sie sie weglassen, dauert die Abfrage weit über fünf Minuten.
Dies ist der Fall, wenn die Abfrage von Query Analyzer oder von meinem C # -Programm über ausgeführt wird SqlCommand.ExecuteReader()
. Anrufen (oder nicht anrufen) DBCC FREEPROCCACHE
oder DBCC dropcleanbuffers
macht keinen Unterschied; Abfrageergebnisse werden immer sofort mit OPTION (RECOMPILE)
und länger als fünf Minuten ohne zurückgegeben. Die Abfrage wird immer mit denselben Parametern aufgerufen [für diesen Test].
Ich verwende SQL Server 2008.
Ich bin ziemlich OPTION
vertraut mit dem Schreiben von SQL, habe aber noch nie zuvor einen Befehl in einer Abfrage verwendet und war mit dem gesamten Konzept der Plan-Caches bis zum Scannen der Beiträge in diesem Forum nicht vertraut. Mein Verständnis aus den Beiträgen ist, dass dies OPTION (RECOMPILE)
eine teure Operation ist. Es wird anscheinend eine neue Suchstrategie für die Abfrage erstellt. Warum sind nachfolgende Abfragen, bei denen das weggelassen OPTION (RECOMPILE)
wird, so langsam? Sollten die nachfolgenden Abfragen nicht die Suchstrategie verwenden, die beim vorherigen Aufruf berechnet wurde und den Hinweis zur Neukompilierung enthielt?
Ist es höchst ungewöhnlich, eine Abfrage zu haben, die bei jedem einzelnen Aufruf einen Neukompilierungshinweis erfordert?
Entschuldigen Sie die Einstiegsfrage, aber ich kann nicht wirklich Kopf oder Zahl daraus machen.
UPDATE: Ich wurde gebeten, die Anfrage zu stellen ...
select acctNo,min(date) earliestDate
from(
select acctNo,tradeDate as date
from datafeed_trans
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_money
where feedid=@feedID and feedDate=@feedDate
union
select acctNo,feedDate as date
from datafeed_jnl
where feedid=@feedID and feedDate=@feedDate
)t1
group by t1.acctNo
OPTION(RECOMPILE)
Wenn ich den Test mit Query Analyzer ausführe, stelle ich die folgenden Zeilen voran:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
Beim Aufruf von meinem C # -Programm werden die Parameter über die SqlCommand.Parameters
Eigenschaft übergeben.
Für die Zwecke dieser Diskussion können Sie davon ausgehen, dass sich die Parameter niemals ändern, sodass wir einen suboptimalen Parametergeruch als Ursache ausschließen können.
X = @X OR @X IS NULL
zu X=@X
und Durchführung einer Such Sehen hier oder Prädikate weiter nach unten gegen eine Ansicht mit Fensterfunktionen drücken
RECOMPILE
. Erfassen Sie auf jeden Fall die Ausführungspläne und sehen Sie sich die Unterschiede an.