KB2481274 — Poprawka: zapytanie korzystające z funkcji DATEDIFF może działać powoli w programie SQL Server 2005 lub SQL Server 2008 lub SQL Server 2008 R2

Dotyczy: SQL Server 2008 R2Microsoft SQL Server 2005SQL Server 2008 Service Pack 2

Firma Microsoft rozpowszechnia poprawki Microsoft SQL Server 2005 lub Microsoft SQL Server 2008 lub SQL 2008 R2 jako pliki do pobrania. Ponieważ poprawki są kumulatywne, każde nowe wydanie zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń dołączone do poprzedniej wersji programu Microsoft SQL Server 2005 lub Microsoft SQL Server 2008 lub SQL 2008 R2 rozwiązanie

Symptomy


Załóżmy, że uruchamiasz zapytanie w wystąpieniu programu Microsoft SQL Server 2005 lub Microsoft SQL Server 2008 lub Microsoft SQL Server 2008 R2, które spełnia następujące warunki:
  • Kwerenda zawiera operator relacyjny. Na przykład operator mniejszości (<).
  • W operandzie operatora relacyjnego jest dostępna funkcja DateDiff .
W takiej sytuacji program SQL Server może wybrać nieoptymalny plan zapytań, aby uruchomić to zapytanie. Dlatego kwerenda może działać wolno.

Przyczyna


Ten problem występuje, ponieważ Optymalizator SQL Server oszacuje liczbę wierszy, które zostaną zwrócone po użyciu funkcji DateDiff .

Rozwiązanie


Informacje o aktualizacji zbiorczej

SQL Server 2005 z dodatkiem Service Pack 3

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 15 dla programu SQL Server 2005 z dodatkiem Service Pack 3. Aby uzyskać więcej informacji na temat tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2507766 Pakiet aktualizacji zbiorczej 15 dla programu SQL Server 2005 z dodatkiem Service Pack 3
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały dołączone do poprzedniej wersji poprawki SQL Server 2005. Firma Microsoft zaleca zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
960598 Kompilacje programu SQL Server 2005 wydane po opublikowaniu dodatku Service Pack 3 dla programu SQL Server 2005
Poprawki programu Microsoft SQL Server 2005 są tworzone dla określonych pakietów Service Pack programu SQL Server. Musisz zastosować poprawkę dodatku Service Pack 3 dla programu SQL Server 2005 do instalacji dodatku Service Pack 3 dla programu SQL Server 2005. Wszystkie poprawki podane w dodatku Service Pack programu SQL Server są domyślnie zawarte w następnym dodatku Service Pack dla programu SQL Server.

SQL Server 2005 z dodatkiem Service Pack 4

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 2 dla programu SQL Server 2005 z dodatkiem Service Pack 4. Aby uzyskać więcej informacji na temat tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2489409 Pakiet aktualizacji zbiorczej 2 dla programu SQL Server 2005 z dodatkiem Service Pack 4
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały dołączone do poprzedniej wersji poprawki SQL Server 2005. Firma Microsoft zaleca zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2485757 Kompilacje programu SQL Server 2005 wydane po opublikowaniu dodatku Service Pack 4 dla programu SQL Server 2005
Poprawki programu Microsoft SQL Server 2005 są tworzone dla określonych pakietów Service Pack programu SQL Server. Musisz zastosować poprawkę dodatku Service Pack 4 dla programu SQL Server 2005 do instalacji dodatku Service Pack 4 do programu SQL Server 2005. Wszystkie poprawki podane w dodatku Service Pack programu SQL Server są domyślnie zawarte w następnym dodatku Service Pack dla programu SQL Server.

SQL Server 2008 z dodatkiem Service Pack 1

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 13 dla programu SQL Server 2008 z dodatkiem Service Pack 1. Aby uzyskać więcej informacji na temat tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2497673 Pakiet aktualizacji zbiorczej 13 dla programu SQL Server 2008 z dodatkiem Service Pack 1
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały dołączone do poprzedniej wersji poprawki SQL Server 2008. Firma Microsoft zaleca zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
970365 Kompilacje programu SQL Server 2008 wydane po opublikowaniu dodatku Service Pack 1 dla programu SQL Server 2008
Poprawki programu Microsoft SQL Server 2008 są tworzone dla określonych pakietów Service Pack programu SQL Server. Musisz zastosować poprawkę dodatku Service Pack 1 dla programu SQL Server 2008 do instalacji dodatku Service Pack 1 do programu SQL Server 2008. Wszystkie poprawki podane w dodatku Service Pack programu SQL Server są domyślnie zawarte w następnym dodatku Service Pack dla programu SQL Server.

SQL Server 2008 z dodatkiem Service Pack 2

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 3 dla programu SQL Server 2008 z dodatkiem Service Pack 2. Aby uzyskać więcej informacji na temat tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2498535 Pakiet aktualizacji zbiorczej 3 dla programu SQL Server 2008 z dodatkiem Service Pack 2
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały dołączone do poprzedniej wersji poprawki SQL Server 2008. Firma Microsoft zaleca zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2402659 Kompilacje programu SQL Server 2008 wydane po opublikowaniu dodatku Service Pack 2 dla programu SQL Server 2008
Poprawki programu Microsoft SQL Server 2008 są tworzone dla określonych pakietów Service Pack programu SQL Server. Musisz zastosować poprawkę dodatku Service Pack 2 dla programu SQL Server 2008 do instalacji dodatku Service Pack 2 do programu SQL Server 2008. Wszystkie poprawki podane w dodatku Service Pack programu SQL Server są domyślnie zawarte w następnym dodatku Service Pack dla programu SQL Server.

SQL Server 2008 R2 z dodatkiem Service Pack 1

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 1 dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1. Aby uzyskać więcej informacji na temat sposobu uzyskiwania tego zbiorczego pakietu aktualizacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2544793 Pakiet aktualizacji zbiorczej 1 dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń dołączone do poprzedniej wersji poprawki SQL Server 2008 R2. Zalecamy zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2567616 Kompilacje programu SQL Server 2008 R2, które zostały wydane po opublikowaniu dodatku Service Pack 1 dla programu SQL Server 2008 R2

SQL Server 2008 R2

Poprawka dotycząca tego problemu została wydana po raz pierwszy w aktualizacji zbiorczej 7. Aby uzyskać więcej informacji na temat sposobu uzyskiwania tego zbiorczego pakietu aktualizacji dla programu SQL Server 2008 R2, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2507770 Pakiet aktualizacji zbiorczej 7 dla programu SQL Server 2008 R2
Uwaga Ponieważ kompilacja jest zbiorcza, każdy nowy pakiet poprawek zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń dołączone do poprzedniej wersji poprawki SQL Server 2008 R2. Zalecamy zastosowanie najnowszego wydania poprawki zawierającego tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
981356 Kompilacje programu SQL Server 2008 R2, które zostały wydane po opublikowaniu programu SQL Server 2008 R2

Stan


Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".

Obejście


Aby obejść ten problem, należy ponownie napisać zapytanie, aby w planie zapytania nie była używana funkcja DateDiff w predykatach. Na przykład następujące czynności mogą działać wolno:
create procedure proc_test @date datetimeasselect COUNT (*) from t where c1 <DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0)  
Aby obejść ten problem, można jednak napisać zapytanie jako następujące:
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) 

Informacje


Aby uzyskać więcej informacji dotyczących modelu obsługi przyrostowej dla programu SQL Server, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
935897 Model obsługi przyrostowej jest dostępny w zespole programu SQL Server w celu dostarczenia poprawek dotyczących zgłaszanych problemów
Aby uzyskać więcej informacji na temat schematu nazewnictwa dla aktualizacji programu SQL Server, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
822499 Nowy schemat nazewnictwa dla pakietów aktualizacji oprogramowania Microsoft SQL Server
Aby uzyskać więcej informacji o terminologii dotyczącej aktualizacji oprogramowania, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
824684 Opis standardowej terminologii używanej do opisywania aktualizacji oprogramowania firmy Microsoft