KB2481274-修正:使用 DATEDIFF 函數的查詢在 SQL Server 2005 或 SQL server 2008 或 sql server 2008 R2 中可能會執行緩慢

Microsoft 將 Microsoft SQL Server 2005 或 Microsoft SQL Server 2008 或 SQL 2008 R2 修正為一個可下載的檔案。 因為修正程式是累加的,所以每個新版本都包含舊版 Microsoft SQL Server 2005 或 Microsoft SQL Server 2008 或 SQL 2008 R2 修正版本中所包含的所有修復程式及所有安全性修正程式。

徵狀

假設您在已滿足下列條件的 Microsoft SQL Server 2005 或 Microsoft SQL server 2008 或 Microsoft SQL Server 2008 R2 實例上執行查詢:

  • 查詢包含關聯式運算子。 例如,小於(<)運算子。

  • 在關聯式運算子的運算元中,有一個 DATEDIFF 函數。

在這種情況下,SQL Server 可能會選取一個不理想的查詢方案來執行此查詢。 因此,查詢的執行速度可能很慢。

原因

發生這個問題的原因是,當您使用 DATEDIFF 函數時,SQL Server 優化程式 underestimates 會傳回的列數。

解決方案

累積更新資訊

SQL Server 2005 Service Pack 3

此問題的修正程式會在 SQL Server 2005 Service Pack 3 的累積更新15中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2507766 SQL Server 2005 的累積更新套件 15 Service Pack 3注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2005 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

960598 在發行 SQL Server 2005 Service Pack 3 之後發行的 SQL Server 2005 組建 Microsoft SQL Server 2005 修復程式是針對特定的 SQL Server service pack 建立的。 您必須將 SQL Server 2005 Service Pack 3 修復程式套用至 SQL Server 2005 Service Pack 3 的安裝。 根據預設,SQL Server service pack 中提供的任何熱修復程式都包含在下一個 SQL Server service pack 中。

SQL Server 2005 Service Pack 4

此問題的修正程式是在 SQL Server 2005 的累積更新2(Service Pack 4)中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2489409 SQL Server 2005 的累積更新套件 2 Service Pack 4注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2005 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2485757 在發行 SQL Server 2005 Service Pack 4 之後發行的 SQL Server 2005 組建 Microsoft SQL Server 2005 修復程式是針對特定的 SQL Server service pack 建立的。 您必須將 SQL Server 2005 Service Pack 4 修復程式套用至 SQL Server 2005 Service Pack 4 的安裝。 根據預設,SQL Server service pack 中提供的任何熱修復程式都包含在下一個 SQL Server service pack 中。

SQL Server 2008 Service Pack 1

此問題的修正程式是在 SQL Server 2008 Service Pack 1 的累積式更新13中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2497673 SQL Server 2008 Service Pack 1 的累積更新套件13注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2008 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

970365 在發行 SQL Server 2008 Service Pack 1 之後發行的 SQL Server 2008 組建 Microsoft SQL Server 2008 修復程式是針對特定的 SQL Server service pack 建立的。 您必須將 SQL Server 2008 Service Pack 1 修補程式套用至 SQL Server 2008 Service Pack 1 的安裝。 根據預設,SQL Server service pack 中提供的任何熱修復程式都包含在下一個 SQL Server service pack 中。

SQL Server 2008 Service Pack 2

此問題的修正程式是在 SQL Server 2008 的累積更新3(Service Pack 2)中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2498535 SQL Server 2008 的累積更新套件 3 Service Pack 2注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2008 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2402659 在發行 SQL Server 2008 Service Pack 2 之後發行的 SQL Server 2008 組建 Microsoft SQL Server 2008 修復程式是針對特定的 SQL Server service pack 建立的。 您必須將 SQL Server 2008 Service Pack 2 修補程式套用至 SQL Server 2008 Service Pack 2 的安裝。 根據預設,SQL Server service pack 中提供的任何熱修復程式都包含在下一個 SQL Server service pack 中。

SQL Server 2008 R2 Service Pack 1

此問題的修正程式是在 SQL Server 2008 R2 Service Pack 1 的累積更新1中第一次發行。如需如何取得此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2544793 SQL Server 2008 R2 Service Pack 1 的累積更新套件1注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2008 R2 修正版本中所包含的所有修復程式及所有安全性修正程式。 我們建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2567616 在發行 SQL Server 2008 R2 Service Pack 1 之後發行的 SQL Server 2008 R2 組建

SQL Server 2008 R2

此問題的修正程式是在累積更新7中第一次發行。如需有關如何取得 SQL Server 2008 R2 累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

2507770 SQL Server 2008 R2 的累積更新套件7 注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2008 R2 修正版本中所包含的所有修復程式及所有安全性修正程式。 我們建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

981356 在發行 SQL Server 2008 R2 之後發行的 SQL Server 2008 R2 組建

狀態

Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。

因應措施

若要解決此問題,請重新編寫查詢,使查詢方案不會在謂詞中使用 DATEDIFF 函數。 例如,下列程式可能會執行緩慢:create procedure proc_test @date datetimeasselect COUNT (*) from t where c1 <DATEADD(mm, DATEDIFF(mm,0,dateadd(month, -6,@date)), 0) 不過,您可以按照下列步驟來重寫查詢,以解決問題: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)

參考

如需有關 SQL Server 的增量服務模型的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

935897 您可以從 SQL Server 團隊取得增量服務模型,以提供已報告問題的修補程式如需 SQL Server 更新命名架構的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

822499 Microsoft SQL Server 軟體更新套件的新命名架構如需軟體更新術語的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:

824684 描述 Microsoft 軟體更新所使用的標準術語說明

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與我們的其中一個 Office 支援專員連絡以深入了解您的意見。

×