Sql-Server

如何僅添加最後一天的數據來更新統計資訊?

  • October 25, 2016

我一直在調整一些對排序運算符有警告的查詢,這通常是一個昂貴的運算符

操作員在溢出級別 2 的執行期間使用 tempdb 溢出數據

提高性能和消除排序運算符警告的方法是更新統計資訊。

UPDATE STATISTICS [Bocss2].[dbo].[tblBOrder]  WITH FULLSCAN
--1 hour  04 min 14 sec

但正如您所見,更新統計數據需要一個多小時。

現在我有一個類似的查詢有同樣的問題。

當@toDate 是今天或昨天時,我收到相同的警告: Operator used tempdb 在執行期間以溢出級別 2 溢出數據

查詢如下, 計劃在這裡。,下圖快速瀏覽。

   DECLARE @FromDate DATETIME = getdate()-1
   DECLARE @ToDate DATETIME = getdate()-0

   SELECT DISTINCT
            ap.strAccountCode
           ,em.strEmail
           ,em.dtmLastUpdated
   FROM    Bocss2.dbo.tblBAccountParticipant AS ap

           LEFT JOIN Bocss2.dbo.tblBAccountParticipantEmail AS em 
                  ON ap.lngParticipantID = em.lngParticipantID

           INNER JOIN Bocss2.dbo.tblBAccountHolder AS ah 
                   ON ap.lngParticipantID = ah.lngParticipantID

           INNER JOIN Bocss2.dbo.tblBOrder AS o 
                   ON ap.lngParticipantID = o.lngAccountParticipantID

   WHERE   o.sdtmOrdCreated >= @FromDate
     AND o.sdtmOrdCreated < @ToDate

OPTION (RECOMPILE)

在此處輸入圖像描述

但是當@toDate 是兩天前時,我根本沒有收到任何警告。

查詢在下面, 計劃在這裡。, 下圖快速瀏覽。

   DECLARE @FromDate DATETIME = getdate()-3
   DECLARE @ToDate DATETIME = getdate()-2

   SELECT DISTINCT
            ap.strAccountCode
           ,em.strEmail
           ,em.dtmLastUpdated
   FROM    Bocss2.dbo.tblBAccountParticipant AS ap

           LEFT JOIN Bocss2.dbo.tblBAccountParticipantEmail AS em 
                  ON ap.lngParticipantID = em.lngParticipantID

           INNER JOIN Bocss2.dbo.tblBAccountHolder AS ah 
                   ON ap.lngParticipantID = ah.lngParticipantID

           INNER JOIN Bocss2.dbo.tblBOrder AS o 
                   ON ap.lngParticipantID = o.lngAccountParticipantID

   WHERE   o.sdtmOrdCreated >= @FromDate
     AND o.sdtmOrdCreated < @ToDate

OPTION (RECOMPILE)

在此處輸入圖像描述

更新訂單表的統計資訊解決了這個問題,但是,它需要一個多小時才能執行。

UPDATE STATISTICS [Bocss2].[dbo].[tblBOrder]  WITH FULLSCAN
--1 hour  04 min 14 sec

我有充分的理由手動更新統計資訊。

我還發現這個連結很有趣: 為什麼 SQL Server 拒絕使用全掃描以外的任何方式更新這些統計資訊?

題:

有沒有一種方法可以更新最後一天的統計資訊,而不是通過全面掃描更新統計資訊?

那將是我每天都可以執行的東西。

尤其是這張表,平均每天有 50k 條新記錄。

首先要嘗試的是嘗試採樣,而不是每次都執行完整掃描。

如果較低的樣本導致計劃不佳或仍然花費太長時間,您可以考慮分區,如果您使用的是 SQL Server 2014 或更高版本,則可以使用增量統計。

增量統計允許您在分區級別重建統計資訊。整個表仍然只有一個統計對象,但分區的統計資訊被合併到直方圖中。

如果您沒有在 Enterprise 版本上執行,或者您使用的是 2014 之前的版本,則可以考慮使用分區視圖。通過這種方式,您可以將數據分區到具有自己的統計對象的完全獨立的表中。

分區和分區視圖帶來了它們自己的複雜性,但通常對於非常大的表是必需的。

您可能會遇到上升鍵問題,請參見此處。如果您是最後一個選項,則可能是減少更新統計資訊的頻率,並使用跟踪標誌 2389 和 2390 來改進更新之間時間的基數估計。

引用自:https://dba.stackexchange.com/questions/153247