Іноді я отримую "Не вдалося продовжити сканування NOLOCK
через рух даних" з деякими великими завданнями, які є WITH (NOLOCK)
у вибраних запитах.
Я розумію, що це має щось спільне із спробою вибору даних, коли відбувся розкол сторінки, що призвело до того, що дані вже не там, де повинні були бути - я припускаю, що це відбувається в моєму середовищі.
Як би я відтворив це?
Я намагаюся зробити короткочасний спосіб вирішити помилку та повторити спробу, коли це трапиться, але я не можу перевірити її, якщо я не можу її відтворити. Чи є досить надійний спосіб викликати це?
Коли це все-таки відбувається, виконання запиту знову призводить до успіху - тому я насправді не маю жодних побоювань щодо того, що фактичні дані чи база даних постійно пошкоджуються. Деякі таблиці запиту (разом з їх індексами) часто випадають, відтворюються та повторно заселяються, тому я припускаю, що це щось пов’язане з цим.
Видалення NOLOCK
- це моя довгострокова проблема, яку потрібно вирішити. Причина, NOLOCK
в першу чергу, полягала в тому, що запити настільки погані, що вони ставали в глухий кут із щоденними транзакціями, настільки, що NOLOCK
це допомога, щоб зупинити тупики (що спрацювало). Тому мені потрібна допомога на бандажі, поки ми не зможемо вирішити постійне рішення.
Якби я міг відтворити це за допомогою Hello World, я б запланував, щоб, ймовірно, заштрихувати допомогу в роботі менше ніж за годину. Неможливо виконати пошук і заміну видалення NOLOCK
, тому що я б знову почав отримувати тупики програми, які для мене гірші, ніж випадкові збої в роботі.
Використання зчитуваного виділеного знімка знімків є хорошою можливістю - мені доведеться співпрацювати з нашою командою бази даних, щоб отримати детальнішу інформацію про це. Частина нашої проблеми полягає в тому, що у нас немає експерта SQL Server, який би займався подібними питаннями, і я не розумію рівня ізоляції достатньо добре, щоб зробити цю зміну зараз.
DEADLOCK_PRIORITY
на LOW
завдання, так що, якщо існують тупикові місця, завдання будуть виходити з ладу, а не програми. Після цього ви можете дослідити тупикові місця та дізнатись, чому вони відбуваються, та виправити цю проблему. Це може бути дуже просте виправлення, як-от заміна порядку двох висловлювань. Якою б не була проблема, NOLOCK
це не вирішення , так перестати намагатися змусити його бути просто тому , що це найпростіший.
NOLOCK
з цих робочих місць? 601 має бути найменшим, що турбується, якщо результати цих запитів повинні бути точними . Пол Уайт показує особливо жахливий приклад читання даних, які тут не повинні бути можливими .