2010-10-21 84 views
5

我有一個表,它是在目前相當規模不大,但將增長到幾百萬行,所以我希望從一開始就建立的東西。SQL服務器過濾索引

表包含15個左右的包含代理電話的性能信息列,但不是真正相關。其中一個在此表上運行的查詢將查看agent_ID在上個月的4列中的數據。當然,我通常只會在Agent_ID和日期包括4列的覆蓋索引並完成它,但我期待看看我能否比這更聰明。

由於我使用的是SQL服務器2008R2我以爲我會看看過濾索引並且只填充了當月的數據索引。問題是我似乎無法接受除濾波器上的硬性值之外的任何內容。

我是不是找錯了樹這一塊,你可以做,甚至在SQL服務器,而不必訴諸於具有兩個表或一些其他類型的分區?

編輯: 感謝馬庫斯我知道,知道這是不可能做到這一點沒有一些體力勞動。

爲此我做了這個劇本,我將在黑暗的時間每個月開始運行到移動索引窗口

USE [Tracker_3] 
GO 
DECLARE @FirstOfMonth datetime 
DECLARE @LastOfMonth datetime 

declare @strSQL as varchar(max) 
set @FirstOfMonth = CONVERT(smalldatetime, CONVERT(varchar(4), DATEPART(yy, GETDATE())) + '-' + CONVERT(varchar(2), DATEPART(mm, GETDATE())) + '-' + '1') 
set @LastOfMonth = DATEADD(dd, -1, DATEADD(mm, +1, @FirstOfMonth)) 


set @strSQL=' 

CREATE NONCLUSTERED INDEX [tblAgent_int_data_Covering_1] ON [dbo].[tblAgent_interval_data] 
(
    [Login_ID] ASC, 
    [Date] ASC 
) 
INCLUDE ([i_acdtime], 
[i_acwtime], 
[holdacdtime], 
[acdcalls]) 
WHERE [date] >= ''' + convert(char(10),convert(date,@firstOfMonth)) + ''' AND [date] <= '''+ convert(char(10),convert(date,@LastOfMonth)) + ''' 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = ON, ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, 
    FILLFACTOR = 100) ON [T3_Data_2] 

' 

exec (@strSQL) 
+2

您總是可以覆蓋2個月並每月重新創建 – 2010-10-21 10:46:17

回答

3

什麼你盡力去完成是不可能沒有某種形式的「手動」維護 - 它類似於problem of indexing "Age"

我說最好的辦法是分區 - 但你將需要刪除/定期創建新的分區。