У меня есть два набора запросов, один работает нормально, а другой нет:
Не сработал запрос:
select *
from statusreport
where START_DATE_TIME >= '2019-03-01 00:00:00.000'
and START_DATE_TIME < '2019-03-05 00:00:00.000'
Запрос не отвечает. Никаких результатов не получено, и запрос постоянно находится в состоянии выполнения.
Запрос, который работал:
select *
from statusreport
where START_DATE_TIME >= '2019-02-20 00:00:00.000'
and START_DATE_TIME < '2019-03-05 00:00:00.000'
Когда я был беспомощен, я начал возвращаться к дате начала, и я получил запрос, дающий какой-то результат.
Это не имеет никакого смысла, по крайней мере для меня. Записей тоже не много. У меня едва ли есть 2 тыс. строк, из которых около 200 соответствовали бы запросу 1, который я упомянул выше.
Что может быть причиной такого поведения? Я пропустил что-то важное?
Можете ли вы попробовать использовать синтаксис Between? Они эквивалентны, потому что движок преобразует оператор between в ваш формат.
Кроме того, если у вас есть индекс в столбце start_date_time, он может быть поврежден, и вам может потребоваться создать его.
«Между» не даст эквивалента, так как запрос теперь не включает день 2019-03-05, а между ними будет получен результат с включенным 2019-03-05 00:00:00. В любом случае проблема не здесь
@Yutha Пожалуйста, вставьте свои планы сюда brentozar.com/pastetheplan и обновите свои вопросы со ссылками на оба плана.
Упомянутое вами небольшое количество строк должно запускаться мгновенно даже без использования индексов. Является ли отчет о статусе таблицей? Или это сверхсложное представление, которое выполняет агрегированные вычисления для миллионов соединенных строк, чтобы получить, казалось бы, маленькие 2k строк, которые вы упомянули?
@Norcino С DATETIME довольно опасно использовать BETWEEN. Вы можете прочитайте этот плохая привычка пинать Аарона Бертрана
Ожидающая (незафиксированная) транзакция в другом сеансе?
Это все еще воспроизводимо? Если нет, то, возможно, ожидающая транзакция, как упомянул Schnugo, или что-то еще блокировало выполнение, например, автоматическое обновление статистики.
Я попытался использовать синтаксис BETWEEN, и поведение было таким же.
Что меня беспокоит, так это то, почему запрос возвращает результаты для диапазона дат, который составляет, скажем, 15 дней, а не для диапазона меньше этого. Я использую выпуск SQL Server Express. Может быть, это бизнес-уловка, чтобы заставить меня купить лицензию (надеюсь, MS как компания не такая дешевая). Отчет о состоянии — это просто таблица с несколькими тысячами записей. У меня есть графический интерфейс, чтобы получить результат в соответствии с выбором даты. Но дело в том, что в редакторе запросов только я сталкиваюсь с этой проблемой. Никаких других параллельных обновлений в таблице не происходит.
Возвращает ли 'dbcc checkdb' какие-либо ошибки?
Это не дало никакой ошибки





Вы должны сравнить оба плана выполнения. Если у вас есть индекс на START_DATE_TIME, его можно было использовать в первом случае из-за устаревшей статистики: сервер мог подумать, что строк нет / очень мало строк для этого интервала, и использовать вложенные циклы (поиск некластеризованного индекса + поиски). Во втором случае он может выбрать сканирование таблицы