2010-10-21 21 views
5

Tengo una tabla que es bastante modesta en este momento, pero crecerá a unos pocos millones de filas, así que estoy buscando construir cosas desde el principio.Índice filtrados del servidor SQL

La tabla contiene aproximadamente 15 columnas que contienen información para el rendimiento de la telefonía del agente, pero eso no es realmente relevante. Una de las consultas que se ejecuta en esta tabla examina datos de 4 columnas para el último mes por agent_ID. Por supuesto, normalmente solo incluiría un índice de cobertura en Agent_ID y date incluyendo las 4 columnas y terminaré con esto, pero estoy buscando si puedo ser un poco más inteligente que eso.

Como utilizo el servidor SQL 2008R2 pensé que podría echarle un vistazo a los índices filtrados y que solo el índice se llena con los datos del mes actual. El problema es que parece que no puedo aceptar nada que no sea un valor difícil en el filtro.

¿Estoy ladrando en el árbol equivocado con este, incluso se puede hacer eso en el servidor SQL sin tener que recurrir a tener dos tablas o algún otro tipo de partición?

EDIT: Gracias a Marcus sé que no es posible hacer esto sin algún trabajo manual.

Para ello he hecho este script que voy a correr al comienzo de cada mes durante horas de oscuridad para mover la ventana de índice en

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

Siempre puede cubrir 2 meses y volver a crearlo mensualmente –

Respuesta

3

Lo que se intenta llevar a cabo no es posible sin algún tipo de mantenimiento "manual": es similar al problem of indexing "Age".

Diría que el mejor enfoque es la creación de particiones, pero tendrá que soltar/crear nuevas particiones regularmente.

Cuestiones relacionadas