Не вдалося продовжити сканування за допомогою NOLOCK через рух даних


10

Ми запускаємо SQL Server 2000, і ми отримуємо кілька таких помилок щовечора.

Could not continue scan with NOLOCK due to data movement

Запит, який видає цю помилку, - це великий складний запит, який об'єднується у десяток таблиць. Наші основні дані можна часто оновлювати.

Культурна "найкраща практика" полягає в тому, що в минулому впровадження NOLOCKнатяків на підвищення продуктивності та підвищення конкурентоспроможності. Цей запит не повинен бути на 100% точним, тобто ми будемо терпіти брудні читання тощо. Однак ми намагаємось зрозуміти, чому база даних кидає цю помилку, хоча ми маємо всі ці підказки щодо блокування.

Хтось може пролити щось на це - будь ласка, я насправді програміст, а не DBA :)

PS: Ми раніше застосували вказане нижче виправлення: http://support.microsoft.com/kb/815008


3
Я б відкинув NOLOCK і виправив запит / індекси / процес. Ми можемо допомогти звичайно ... Також дивіться en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi: SQL 2012 вишукано відновлює у багатьох випадках переміщення даних під брудним скануванням (продовжується на наступній сторінці в порядку розподілу).
Ремус Русану

1
@SQLKiwi: так, все ще є. Про добру новину: також курсори, підкріплені брудними скануваннями, повинні вирішувати це більш витончено.
Рем Русану

Відповіді:


7

Це досить відома проблема із SQL Server 2000 - по суті, що трапляється, якщо рядок видаляється процесом А, поки процес B виконує сканування (або в, READ UNCOMMITTEDабо WITH (NOLOCK)), тоді процес B проходить "так, що сталося з цими даними "коли він намагається його прочитати. Точніше, рядок потрібно видалити після того, як процес B зчитує індекс, але перед тим, як спробувати прочитати рядок даних.

Крейг Фрідман добре пише тут

На щастя, виправити порівняно просто: http://support.microsoft.com/kb/815008

Якщо це не працює, у вас є трохи більш болісний варіант видалити всі WITH (NOLOCK)підказки та встановити рівень ізоляції транзакцій на щось вище READ UNCOMMITTED.


Ми в курсі цього виправлення - ми застосували прапор, перезапустили і ми все ще отримуємо ці помилки.
Ciaran Archer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.