KB2481274-Fix: eine Abfrage, die die DateDiff-Funktion verwendet, kann in SQL Server 2005 oder in SQL Server 2008 oder in SQL Server 2008 R2 langsam ausgeführt werden.

Gilt für: SQL Server 2008 R2Microsoft SQL Server 2005Microsoft SQL Server 2008 Service Pack 2

Microsoft vertreibt Microsoft SQL Server 2005-oder Microsoft SQL Server 2008-oder SQL 2008 R2-Fixes als eine herunterladbare Datei. Da die Fixes kumulativ sind, enthält jede neue Version alle Hotfixes und alle Sicherheitsupdates, die in der vorherigen Version von Microsoft SQL Server 2005 oder Microsoft SQL Server 2008 oder SQL 2008 R2 enthalten waren.

Problembeschreibung


Es wird davon ausgegangen, dass Sie eine Abfrage für eine Instanz von Microsoft SQL Server 2005 oder Microsoft SQL Server 2008 oder Microsoft SQL Server 2008 R2 ausführen, die die folgenden Bedingungen erfüllt:
  • Die Abfrage enthält einen relationalen Operator. Beispiel: der Operator kleiner als (#a0).
  • Im Operanden des relationalen Operators ist eine DateDiff -Funktion vorhanden.
In diesem Fall kann SQL Server einen suboptimalen Abfrageplan zum Ausführen dieser Abfrage auswählen. Daher kann die Abfrage langsam ausgeführt werden.

Ursache


Dieses Problem tritt auf, weil der SQL Server-Optimierer die Anzahl der Zeilen unterschätzt, die zurückgegeben werden, wenn Sie die DateDiff -Funktion verwenden.

Fehlerbehebung


Informationen zum kumulativen Update

SQL Server 2005 Service Pack 3

Der Fix für dieses Problem wurde erstmals im kumulativen Update 15 für SQL Server 2005 Service Pack 3 veröffentlicht. Wenn Sie weitere Informationen zu diesem kumulativen Updatepaket erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2507766 Kumulatives Updatepaket 15 für SQL Server 2005 Service Pack 3
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die in der vorherigen Version von SQL Server 2005 behoben wurden. Microsoft empfiehlt, die neueste Fix-Version zu verwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
960598 Die SQL Server 2005-Builds, die nach der Veröffentlichung von SQL Server 2005 Service Pack 3 veröffentlicht wurden
Microsoft SQL Server 2005-Hotfixes werden für bestimmte SQL Server-Service Packs erstellt. Sie müssen einen SQL Server 2005 Service Pack 3-Hotfix auf eine Installation von SQL Server 2005 Service Pack 3 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server-Service Pack bereitgestellt wird, im nächsten SQL Server-Service Pack enthalten.

SQL Server 2005 Service Pack 4

Der Fix für dieses Problem wurde erstmals im kumulativen Update 2 für SQL Server 2005 Service Pack 4 veröffentlicht. Wenn Sie weitere Informationen zu diesem kumulativen Updatepaket erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2489409 Kumulatives Updatepaket 2 für SQL Server 2005 Service Pack 4
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die in der vorherigen Version von SQL Server 2005 behoben wurden. Microsoft empfiehlt, die neueste Fix-Version zu verwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2485757 Die SQL Server 2005-Builds, die nach der Veröffentlichung von SQL Server 2005 Service Pack 4 veröffentlicht wurden
Microsoft SQL Server 2005-Hotfixes werden für bestimmte SQL Server-Service Packs erstellt. Sie müssen einen SQL Server 2005 Service Pack 4-Hotfix auf eine Installation von SQL Server 2005 Service Pack 4 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server-Service Pack bereitgestellt wird, im nächsten SQL Server-Service Pack enthalten.

SQL Server 2008 Service Pack 1

Der Fix für dieses Problem wurde erstmals im kumulativen Update 13 für SQL Server 2008 Service Pack 1 veröffentlicht. Wenn Sie weitere Informationen zu diesem kumulativen Updatepaket erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2497673 Kumulatives Updatepaket 13 für SQL Server 2008 Service Pack 1
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die in der vorherigen Version von SQL Server 2008 behoben wurden. Microsoft empfiehlt, die neueste Fix-Version zu verwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
970365 Die SQL Server 2008-Builds, die nach der Veröffentlichung von SQL Server 2008 Service Pack 1 veröffentlicht wurden
Microsoft SQL Server 2008-Hotfixes werden für bestimmte SQL Server-Service Packs erstellt. Sie müssen einen SQL Server 2008 Service Pack 1-Hotfix auf eine Installation von SQL Server 2008 Service Pack 1 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server-Service Pack bereitgestellt wird, im nächsten SQL Server-Service Pack enthalten.

SQL Server 2008 Service Pack 2

Der Fix für dieses Problem wurde erstmals im kumulativen Update 3 für SQL Server 2008 Service Pack 2 veröffentlicht. Wenn Sie weitere Informationen zu diesem kumulativen Updatepaket erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2498535 Kumulatives Updatepaket 3 für SQL Server 2008 Service Pack 2
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die in der vorherigen Version von SQL Server 2008 behoben wurden. Microsoft empfiehlt, die neueste Fix-Version zu verwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2402659 Die SQL Server 2008-Builds, die nach der Veröffentlichung von SQL Server 2008 Service Pack 2 veröffentlicht wurden
Microsoft SQL Server 2008-Hotfixes werden für bestimmte SQL Server-Service Packs erstellt. Sie müssen einen SQL Server 2008 Service Pack 2-Hotfix auf eine Installation von SQL Server 2008 Service Pack 2 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server-Service Pack bereitgestellt wird, im nächsten SQL Server-Service Pack enthalten.

SQL Server 2008 R2 Service Pack 1

Der Fix für dieses Problem wurde erstmals im kumulativen Update 1 für SQL Server 2008 R2 Service Pack 1 veröffentlicht. Wenn Sie weitere Informationen zum Abrufen dieses kumulativen Updatepakets benötigen, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2544793 Kumulatives Update Paket 1 für SQL Server 2008 R2 Service Pack 1
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die mit der vorherigen Version von SQL Server 2008 R2 behoben wurden. Wir empfehlen, dass Sie die neueste Fix-Version anwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2567616 Die SQL Server 2008 R2-Builds, die nach dem Veröffentlichen von SQL Server 2008 R2 Service Pack 1 veröffentlicht wurden

SQL Server 2008 R2

Der Fix für dieses Problem wurde erstmals im kumulativen Update 7 veröffentlicht. Wenn Sie weitere Informationen zum beziehen dieses kumulativen Updatepakets für SQL Server 2008 R2 benötigen, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
2507770 Kumulatives Update Paket 7 für SQL Server 2008 R2
Hinweis Da die Builds kumulativ sind, enthält jede neue Fix-Version alle Hotfixes und alle Sicherheitsupdates, die mit der vorherigen Version von SQL Server 2008 R2 behoben wurden. Wir empfehlen, dass Sie die neueste Fix-Version anwenden, die diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
981356 Die SQL Server 2008 R2-Builds, die nach der Veröffentlichung von SQL Server 2008 R2 veröffentlicht wurden

Status


Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Problemumgehung


Um dieses Problem zu umgehen, schreiben Sie die Abfrage neu, damit der Abfrageplan die Funktion DateDiff in Prädikaten nicht verwendet. Die folgenden Schritte können beispielsweise langsam ausgeführt werden:
create procedure proc_test @date datetimeasselect COUNT (*) from t where c1 <DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0)  
Sie können die Abfrage jedoch wie folgt umschreiben, um das Problem zu umgehen:
create procedure proc_test2 @date datetimeasdeclare @datestr nvarchar(50), @sqlstr nvarchar(1024)set @datestr = CAST (DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0)  as nvarchar(50))set @sqlstr ='select COUNT (*) from t where c1 < ''' + @datestr + ''''exec (@sqlstr) 

Informationsquellen


Wenn Sie weitere Informationen zum inkrementellen Wartungsmodell für SQL Server erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
935897 Ein inkrementelles Wartungsmodell steht im SQL Server-Team zum Bereitstellen von Hotfixes für gemeldete Probleme zur Verfügung.
Wenn Sie weitere Informationen zum Benennungsschema für SQL Server-Updates erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
822499 Neues Benennungsschema für Microsoft SQL Server-Softwareupdatepakete
Wenn Sie weitere Informationen zur Terminologie für Softwareupdates erhalten möchten, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
824684 Beschreibung der Standardterminologie, die zum Beschreiben von Microsoft-Softwareupdates verwendet wird