Sql-Server
使用統計資訊來決定是否添加過濾索引
我對錶有很多查詢
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/