Sql-Server

使用統計資訊來決定是否添加過濾索引

  • November 17, 2016

我對錶有很多查詢dbo.tblSAPDespatchItem,其中一些在以下條件下where clause

WHERE   b.lngDespatchItemStatusID = 2 
AND     b.decvalue > 0

例如

查詢的部分列表:

           ,despatchDate= CAST(CAST( a.dtmUpdated AS DATE ) AS DATETIME)
           ,strbxorderNo=A.strBxOrderNo

   FROM    dbo.tblSAPDespatch a
   INNER JOIN dbo.tblSAPDespatchItem b on a.lngDespatchID = b.lngDespatchID
   INNER JOIN [dbo].[tblBorder] C on C.strBxOrderNo = A.strBxOrderNo

   INNER JOIN dbo.tblBAccountParticipantEmail D on C.lngOrderedByParticipantID = D.lngParticipantID

   INNER JOIN dbo.tblBAccountParticipant E on d.lngParticipantID = e.lngParticipantID
   INNER JOIN dbo.vwtblItem F on f.strItemNo = b.strItemNo
   INNER JOIN @DIS DIS ON A.lngDespatchStatusID = DIS.lngDespatchStatusID
   INNER JOIN dbo.tblBMarket H on H.sintMarketID = c.sintMarketID

   WHERE   b.lngDespatchItemStatusID = 2 
   AND     f.strStyle not in ( 'VOUCH', 'GG001', 'GG002' )
   AND     d.strEmail = @email 
   AND     a.sintMarket = @marketId 
   AND     a.[dtmUpdated] BETWEEN @BeginDt AND @EndDate
   AND     b.decvalue > 0

我可以使用統計數據來評估添加過濾索引的好處嗎?

在此處使用此問題中的腳本:

如何在 Sql Server 中編寫統計腳本?(使用 T-SQL)

我得到了該表上的所有統計資訊:

CREATE STATISTICS [_WA_Sys_00000006_33B97E11] ON [dbo].[tblSAPDespatchItem]( [strItemNo])
CREATE STATISTICS [_WA_Sys_00000007_33B97E11] ON [dbo].[tblSAPDespatchItem]( [strLocation])
CREATE STATISTICS [_WA_Sys_00000008_33B97E11] ON [dbo].[tblSAPDespatchItem]( [sintOrderItemSeqNo])
CREATE STATISTICS [_WA_Sys_0000000E_33B97E11] ON [dbo].[tblSAPDespatchItem]( [lngUserID])
CREATE STATISTICS [_WA_Sys_0000000F_33B97E11] ON [dbo].[tblSAPDespatchItem]( [dtmUpdated])
CREATE STATISTICS [_WA_Sys_00000010_33B97E11] ON [dbo].[tblSAPDespatchItem]( [decValue])
CREATE STATISTICS [_WA_Sys_00000011_33B97E11] ON [dbo].[tblSAPDespatchItem]( [sintOrderSeqNo])

然後執行以下命令:

dbcc show_statistics ('tblSAPDespatchItem','_WA_Sys_00000010_33B97E11')

我得到以下圖片:

在此處輸入圖像描述

從圖片:

SELECT CONVERT(BIGINT,STR(CAST('1.9777E+07' AS REAL))) 
SELECT CONVERT(BIGINT,STR(CAST('2.199613E+07' AS REAL))) 

這給了我:

select 21996130 + 19777000
-- 41,773,130

基本上我不需要處理將近 4200 萬行

並且與表中的實際值進行比較時,它們大致匹配:

sp_count 'tblSAPDespatchItem'
-- 175,918,697

select count(*)
from tblSAPDespatchItem with (nolock)
where decvalue <= 0
--19,396,110

select count(*)
from tblSAPDespatchItem with (nolock)
where decvalue <= 0
or decvalue is null 
-- 43,238,039

這可能不是過濾索引真正發揮作用的那種情況——通常是當索引只代表表中的一小部分行(比如四分之一或更少),在這種情況下,過濾謂詞匹配大約四分之三桌子。

這並不是說你不會在這裡獲得收益,但獲得好的設計可能是一個有點棘手的研究項目。(話說回來,索引總是這樣。)

表上的目前索引怎麼樣。他們現在正在使用嗎?它們是否僅用於具有您提到的謂詞的查詢?如果是這樣,那麼將一些現有索引轉換為具有過濾條件(而不是添加新的過濾索引)可能是一個輕鬆的勝利。

您可能已經知道這一點,但過濾索引不會被與過濾器匹配的謂詞使用變數或參數的地方使用。https://www.brentozar.com/archive/2013/11/what-you-can-and-cant-do-with-filtered-indexes/

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