2010-10-21 14 views
5

J'ai une table de taille assez modeste pour le moment, mais qui atteindra quelques millions de lignes, donc je cherche à construire des choses dès le départ.Indices filtrés par le serveur SQL

La table contient environ 15 colonnes contenant des informations sur les performances de téléphonie de l'agent, mais ce n'est pas vraiment pertinent. L'une des requêtes qui s'exécute sur cette table examine les données de 4 colonnes pour le dernier mois par ID_agent. Bien sûr, normalement, je voudrais juste un index de couverture sur Agent_ID et la date, y compris les 4 colonnes et être fait avec, mais je cherche à voir si je peux être un peu plus intelligent que cela. Comme j'utilise le serveur SQL Server 2008R2, j'ai pensé que je regarderais les index filtrés et que je n'aurais que l'index rempli avec les données du mois en cours. Le problème est que je ne peux pas sembler l'obtenir pour accepter autre chose qu'une valeur difficile sur le filtre. Est-ce que je peux abîmer le mauvais arbre avec celui-ci, pouvez-vous même le faire dans SQL Server sans avoir à avoir deux tables ou un autre type de partitionnement?

EDIT: Merci à Marcus je sais savoir qu'il n'est pas possible de le faire sans un travail manuel.

À cette fin, je l'ai fait ce script que je vais courir au début de chaque mois pendant les heures sombres pour déplacer la fenêtre d'index sur

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

Vous pouvez toujours couvrir 2 mois et le recréer tous les mois –

Répondre

3

Qu'est-ce que vous essayez d'accomplir est impossible sans une sorte de maintenance "manuelle" - elle est similaire à la problem of indexing "Age".

Je dirais que la meilleure approche est le partitionnement - mais vous devrez supprimer/créer de nouvelles partitions régulièrement.