2010-10-21 87 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"

我说最好的办法是分区 - 但你将需要删除/定期创建新的分区。