Сколько строк вы ожидаете между типичным диапазоном дат? Вы обычно смотрите на месяц за раз?
Я бы начал с индекса по столбцу [Date]
. Если для типичного запроса у вас получилось небольшое количество строк, вам не нужно добавлять столбец [OrderId]
в индекс.
С другой стороны, если у вас есть большое количество строк в обычном месяце, вы можете добавить столбец [OrderId]
в индекс, хотя, поскольку он обрабатывается как логическое значение, он может не купить вам много , Это зависит от того, сколько строк NULL
против NOT NULL
. Если у вас есть много строк за данный месяц, но только у нескольких из них допустимый [OrderId]
, тогда индекс, вероятно, улучшит производительность.
Прочитайте принятый ответ в этом связанном вопросе и определите, стоит ли его индексировать в дополнительном столбце:
Должен ли я индексировать битовое поле в SQL Server?
И, конечно же, протестируйте индексы и планы, созданные с и без индекса.
Обновление: В некоторых других ответах указывается более агрессивный индекс, который должен повысить производительность этого запроса, но может отрицательно повлиять на другие операции в таблице. Например, предлагаемый индекс покрытия позволит SQL Server обрабатывать этот запрос с небольшим влиянием на фактическую таблицу, но может вызвать проблемы, когда другие запросы записывают в фактическую таблицу (поскольку SQL Server потребуется обновить как таблицу, так и индекс покрытия в этот случай).
Поскольку это отчетный запрос, я бы оптимизировал его как можно меньше. Если этот запрос выполняется долго, в результате чего другие, более важные запросы выполняются медленно или по таймауту, я бы оптимизировал этот запрос только настолько, чтобы уменьшить его влияние на другие запросы.
Хотя, если вы ожидаете, что эта таблица продолжит расти, я рассмотрю отдельную схему отчетности и периодически извлекаю данные из этой таблицы.