Я думаю, справжнє питання:
Якщо мене не хвилюють брудні читання, додавання підказки (NOLOCK) до оператора SELECT вплине на продуктивність:
- поточний оператор SELECT
- інші операції проти даної таблиці
Приклад:
Select *
from aTable with (NOLOCK)
Я думаю, справжнє питання:
Якщо мене не хвилюють брудні читання, додавання підказки (NOLOCK) до оператора SELECT вплине на продуктивність:
Приклад:
Select *
from aTable with (NOLOCK)
Відповіді:
1) Так , вибір з NOLOCK
завершиться швидше, ніж звичайний.
2) Так , вибір з NOLOCK
дозволить іншим запитам проти виконаної таблиці завершуватися швидше, ніж звичайний вибір.
Чому це було б?
NOLOCK
зазвичай (залежно від вашого двигуна БД) означає, дайте мені ваші дані, і мені байдуже, у якому стані він знаходиться, і не турбуйтеся, щоб він тримався, поки ви читаєте з нього. Це все відразу швидше, менш ресурсомістке і дуже дуже небезпечно.
Вас слід попередити, щоб ніколи не оновлювали та не виконували нічого критичного для системи або там, де потрібна абсолютна коректність, використовуючи дані, що походять від NOLOCK
прочитаного. Цілком можливо, що ці дані містять рядки, видалені під час запуску запиту або видалені в інших сесіях, які ще не завершені. Можливо, що ці дані включають рядки, які були частково оновлені. Цілком можливо, що ці дані містять записи, що порушують іноземні ключові обмеження. Можливо, що ці дані виключають рядки, які були додані в таблицю, але їх ще не доведено.
Ви справді не можете дізнатися, у якому стані дані.
Якщо ви намагаєтеся отримати такі речі, як кількість рядків або інші зведені дані, де допустима помилка, то NOLOCK
це хороший спосіб підвищити ефективність цих запитів і уникнути негативного впливу на роботу бази даних.
Завжди використовуйте NOLOCK
підказку з великою обережністю і ставитесь до будь-яких даних, які вони повертають, підозріло.
NOLOCK робить більшість операторів SELECT швидшими через відсутність спільних блокувань. Крім того, відсутність видачі замків означає, що письменники не будуть перешкоджати вашому SELECT.
НОЛОК функціонально еквівалентний рівню ізоляції ЧИТАЙТЕ НЕЗАКОНЕНО. Основна відмінність полягає в тому, що ви можете використовувати NOLOCK на деяких таблицях, але не на інших, якщо захочете. Якщо ви плануєте використовувати NOLOCK для всіх таблиць у складному запиті, то використовувати SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED простіше, оскільки вам не потрібно застосовувати підказку до кожної таблиці.
Тут представлена інформація про всі наявні у вас рівні ізоляції, а також підказки щодо таблиці.
На додаток до сказаного вище, ви повинні дуже усвідомлювати, що nolock насправді накладає на вас ризик не отримати рядки, які були допущені до вибору.
Це буде швидше, тому що не потрібно чекати замків
Відповідь - так, якщо запит виконується кілька разів одночасно, тому що для кожної транзакції не потрібно буде чекати, коли інші завершаться. Однак якщо запит виконується один раз самостійно, то відповідь - Ні.
Так . Існує велика ймовірність того, що ретельне використання З (NOLOCK) прискорить вашу базу даних в цілому. Це означає, що іншим транзакціям не доведеться чекати завершення цього оператора SELECT, але, з іншого боку, інші транзакції сповільнюватимуться, оскільки тепер вони ділять час обробки з новою транзакцією.
Будьте обережні лише для використанняWITH (NOLOCK)
в заявах SELECT , на таблицях , які мають кластерний індекс.
З (NOLOCK) часто використовується як магічний спосіб прискорити транзакції з читання баз даних.
Набір результатів може містити рядки, які ще не були виконані, які часто пізніше повертаються назад.
Якщо З (NOLOCK) застосовується до таблиці з некластеризованим індексом, то індекси рядків можуть бути змінені іншими транзакціями, оскільки дані рядків передаються в таблицю результатів. Це означає, що набір результатів може бути відсутніми рядками або відображати один і той же ряд кілька разів.
ЧИТАЙТЕ ЗАВАНТАЖЕНО додає додаткову проблему, коли дані пошкоджуються в одному стовпчику, де кілька користувачів одночасно змінюють одну клітинку.