SQL Server筛选索引

时间:2010-10-21 10:40:53

标签: sql-server sql-server-2008 indexing

目前我的桌子大小非常适中,但会增加到几百万行,所以我希望从一开始就建立起来。

该表包含15个左右的列,其中包含代理电话性能的信息,但这并不是真正相关的。在此表上运行的查询之一通过agent_ID查看上个月4列中的数据。当然,通常我会在Agent_ID和日期上覆盖索引,包括4列并完成它,但我想看看我是否能比这更聪明。

由于我正在使用SQL Server 2008R2,我想我会查看过滤的索引,并且只使用当前月份的数据填充索引。问题是我似乎无法接受除过滤器上的硬值以外的任何其他内容。

我是否用这个树咆哮错误的树,你甚至可以在SQL服务器中这样做,而不必诉诸于两个表或其他类型的分区?

编辑: 感谢Marcus,我知道如果没有一些手工工作,就不可能做到这一点。

为此,我制作了这个脚本,我将在每个月的开始时在黑暗时段运行以移动索引窗口

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)

1 个答案:

答案 0 :(得分:3)

如果没有某种“手动”维护,您无法实现的目标 - 它与problem of indexing "Age"类似。

我认为最好的方法是分区 - 但你需要定期删除/创建新分区。