Я создаю несколько пользовательских отчетов для базы данных 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 минуты.