Я создаю несколько пользовательских отчетов для базы данных SQL Server 2005. База данных принадлежит стороннему приложению управления, которое мы запускаем. Данные, которые я извлекаю, не входят в число основных целей сайта, поэтому данные в основном не индексируются, за исключением столбца меток времени. На данный момент задействована только одна таблица — таблица примерно из 700 миллионов строк. Поэтому, когда я запускаю к нему запрос, который должен вернуть только 50 строк, он должен опросить все 700 мил.
Я хочу ускорить это, но не хочу индексировать каждый столбец, который я добавляю в предложение WHERE - я не знаю, что добавление такого количества индексов в конечном итоге значительно улучшит скорость (или я неправильный?). Поэтому мне любопытно, что было бы лучше, если бы я не мог добавлять новые индексы в таблицу!
Хранимая процедура не кажется лучшим вариантом. Индексированное представление может быть лучшей идеей? Мысли?
Вот схема таблицы:
DeviceGuid (PK, uniqueidentifier, not null)
DeviceID (int, not null)
WindowsEventID (PK, int, not null) (indexed)
EventLog (varchar(64), not null)
EventSource (varchar(64), not null)
EventID (int, not null)
Severity (int, not null)
Description (nvarchar(max), not null)
TimeOfEvent (PK, datetime, not null) (indexed)
OccurrenceNbr (int, not null)
Вот пример запроса:
SELECT COUNT(*) AS NumOcc, EventID, EventLog, EventSource, Severity, TimeOfEvent, Description
FROM WindowsEvent
WHERE DeviceID='34818'
AND Severity=1
AND TimeOfEvent >= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/10/27 12:00:00 AM')
AND TimeOfEvent <= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/11/3 12:00:00 AM')
AND EventID<>34113
AND EventID<>34114
AND EventID<>34112
AND EventID<>57755
AND EventSource<>'AutoImportSvc.exe'
AND EventLog='Application'
GROUP BY EventID, EventLog, EventSource, Severity, Description
ORDER BY NumOcc DESC
Возможно, запрос отстой... он возвращает 53 строки за 4,5 минуты.