SELECT WITH (NOLOCK) иногда не дает результатов - PullRequest
0 голосов
/ 19 ноября 2018

Следующий запрос обычно возвращает большое количество результатов (где-то около ~ 750 тыс. Результатов).Однако на производстве я сталкиваюсь со спорадической ситуацией, когда возвращается 0 результатов.Если бы мы перезапустили его в следующую секунду после того, как он вернул 0, он просто вернул бы результаты в обычном режиме.

Я уверен, что данные все еще там и что не должно быть ничего, что могло быудалите его ...

Я посмотрел в нескольких местах, и я никак не мог найти причину проблемы, о которой говорилось выше ... также, кажется, нет простого способаповторить это ... это просто случайно.

Поскольку мои знания SQL весьма ограничены, не могли бы вы подумать о некоторых сценариях, где это может произойти?Или, может быть, предложить простые способы отладки этого?

SELECT MAX(Table1.Cust_ID) AS cust_id, Table1.Email, MAX(Table1.Cust_Name) as cust_name
FROM dbo.Table1 WITH (NOLOCK)
INNER JOIN dbo.Table2 WITH (NOLOCK)
  ON Table1.id = Table2.id
  WHERE Table1.some_id = 100 AND Table1.some_value = 'test_value'
  AND  Table1.some_boolean_1 = 1
  AND  Table1.some_date_1 IS NULL
  AND (Table1.some_boolean_2 IS NULL OR Table1.some_boolean_2 = 1)
  AND (Table1.some_date_2 > '20171119' OR Table1.some_date_3 > '20171119' OR 
       Table2.some_date_3 > '20171119')
GROUP BY Table1.Email

Большое спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Подсказка WITH (NOLOCK) заставляет SQL Server выполнять запрос без транзакций, что означает, что целостность данных игнорируется, а результаты могут быть любыми промежуточными состояниями. Тот же эффект, что и для уровня изоляции транзакции READ UNCOMMITTED, но только для этого запроса. Результаты могут включать также вставленные, но еще не зафиксированные строки и что-либо еще, кроме транзакции. Не уверен, что приводит к пустому результату, но он может возвращать странные результаты, когда изменения выполняются одновременно.

...