Помимо недетерминированной функции, проблема, которую я вижу, состоит в том, что вы делаете вычисления на поле.Это (обычно) делает любой индекс в поле непригодным для запроса.
Второй абзац этой ссылки ( Десять распространенных ошибок программирования SQL (функции для индексированных столбцов в предикатах) ) предоставляет более подробную информацию о том, когда это происходит, как этого избежать и как иногда оптимизаторы могут использовать индексы, несмотря на использование функций.
Короче говоря, вместо того, чтобы полагаться на улучшенные оптимизаторы, часто можноизмените запрос, оставив поле без изменений (без каких-либо вычислений на нем), но вместо этого выполнив (обращенные) вычисления с другими значениями.В вашем случае на текущую дату, которая предоставляется GetDate()
.Тогда запрос может использовать индекс поля table1.Date
.
Итак, вы можете использовать что-то вроде:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
И вам нужно только найти функции, которые получают вас первым ипоследний день текущего месяца.
Этот пост в блоге может помочь вам: sql-server-query-to-find-first-and-last-day-of-month-/ /
Еще лучше, этот вопрос / ответ StackOverflow: самый простой способ создать дату, которая является первым днем днямесяц, данный, другая дата
Я должен буду проверить, но я думаю, что это небольшое изменение вышеупомянутого сделает:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)