Попробуйте вместо этого:
con2.DT_DateIncluded < '20170102'
Это лучше, потому что она по-прежнему позволяет серверу использовать любые индексы на DT_DateIncluded
колонке. В настоящее время это невозможно. Хуже того, возможно, что запрос должен запускать эту функцию DATEDIFF() для каждой записи в таблице.
Обратите внимание, что это равно, что эквивалентно тому, что вы отправили, даже если оно может не соответствовать тому, что вы намеревались. Я подозреваю, что con2.DT_DateIncluded < '20170101'
ближе к тому, что вы на самом деле имели в виду.
Я также подозреваю, что вы можете сделать это либо без второго экземпляра tblContacts, либо с помощью функции окон, чтобы получить гораздо лучшие результаты или, по крайней мере, с помощью JOIN
вместо IN
, чтобы отфильтровать результаты.
Наконец, по историческим причинам, при вводе даты только значения, вы должны использовать несортированный формат даты , как описано здесь:
The ultimate guide to the datetime datatypes
Для значений даты/времени, вы все равно можете использовать выделенный yyyy-mm-dd hh:mm:ss
, к которому вы привыкли, но если у вас есть только дата, то yyyymmdd
лучше.
Основываясь на этот комментарий:
Моя цель с этим запросом, чтобы получить контакты из компаний, но ограничивается «русских» контактов на компанию
Вы должны смотреть в APPLY
оператор.К сожалению, до сих пор мне не ясно, как все совмещается, но я хотя бы обеспечить демонстрацию с помощью оператора APPLY
, чтобы показать два контактов в компании, которую вы можете использовать в качестве отправной точки:
SELECT TOP 10 ct.ID_Contact, ct.NO_CodCompany
FROM tblCompanies cp
CROSS APPLY (
SELECT TOP 2 ID_Contact, NO_CodCompany
FROM tblContacs
WHERE NO_CodCompany = cp.ID_Company
AND DT_DateIncluded < '20170102'
ORDER BY DT_DateIncluded DESC
) ct
APPLY
работает вид как JOIN
на вложенный запрос SELECT
, где нет ON
; условие соединения вместо этого включено как часть предложения WHERE
в вложенный оператор SELECT
.
Обратите внимание на использование CROSS
. Это исключает компании, у которых вообще нет контактов. Если вы хотите включить эти компании, измените его на OUTER
.
Вы также должны посмотреть, какие индексы вы определили. Единственный индекс в таблице tblContacts
, который выглядит на NO_CodCompany
и DT_DateIncluded
(в таком порядке!), Может творить чудеса для этого запроса, особенно если он также имеет ID_Contact
в предложении INCLUDES
. Затем вы можете заполнить часть запроса tblContacts
целиком из индекса.
Привет, Гордон Линофф, и спасибо за ваш быстрый ответ SUPER. Хотя я должен сказать, что он продолжает работать медленно после того, как эти изменения будут предложены, я сохраню их в коде, так как они могут добавить какую-то производительность в любом случае ... ура! –
'DATEDIFF ('2017-01-01 11:59:50', '2017-01-01')' все еще имеет значение '0'. Эквивалентным кодом будет 'DT_DateIncluded <'20170102'' вместо' DT_DateIncluded <' 20170101'' –
@JoelCoehoorn. , , Непонятно, что поле «DateIncluded» будет иметь компонент времени, хотя это вполне разумно, если префикс «dt» подразумевает «datetime». Я обновил ответ. –