SQL-сервер фильтрует индексы - PullRequest
5 голосов
/ 21 октября 2010

У меня есть таблица довольно скромного размера, но она увеличится до нескольких миллионов строк, поэтому я собираюсь строить ее с самого начала.

Таблица содержит около 15 столбцовсодержит информацию о производительности телефонии агента, но это не очень актуально.Один из запросов, выполняемых в этой таблице, просматривает данные из 4 столбцов за последний месяц по agent_ID.Конечно, обычно я просто использовал бы индекс покрытия для Agent_ID и даты, включая 4 столбца, и покончил с этим, но я смотрю, могу ли я быть немного умнее этого.

Поскольку я используюSQL server 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)

1 Ответ

3 голосов
/ 21 октября 2010

То, что вы пытаетесь выполнить, невозможно без какого-либо «ручного» обслуживания - это похоже на проблему индексации «возраста» .

Я бы сказал, что лучший подход - это разбиение на разделы, но вам придется регулярно удалять / создавать новые разделы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...