Я бачив, як мої старші розробники використовують WITH (NOLOCK) при запитах у SQL Server, і дивуюся, чому вони це роблять. Тепер я дослідив це і зрозумів, що це корисно для покращення продуктивності виконання запиту. Однак у його використанні є й недолік. Недолік у тому, що можна не бути впевненим, що отримуєш дані, які зараз оновлюються в таблиці, тобто без захисту від блокування не можна бути гарантованим, що дані не оновлені змінюється під час виконання запиту. Я передав це посилання і вважав його досить корисним.
Щоб покращити продуктивність SQL-запитів, загалом, першим кроком є створення індексу. Насправді, окрім встановлення індексів, коли ми розміщуємо SQL-команди, додавання розділу WITH (NOLOCK) до синтаксису може покращити явище LOCK-наборів даних у середовище з великою кількістю онлайн-запитів, що покращує продуктивність запитів.
Однак варто зазначити, що SQL SELECT з (NOLOCK) може спричинити брудне читання.
Наприклад:
Тому що SQL Server виконує відповідну перевірку узгодженості замків. Щоб покращити загальну продуктивність запитів до бази даних, додайте WITH (NOLOCK) до кінця імені таблиці в синтаксисі SELECT, хоча (NOLOCK) також прийнятний, але Microsoft все одно рекомендує додати WITH.
Окрім простого SELECT, ви також можете використовувати синтаксис SELECT з JOIN. Але команди ВИДАЛИТИ, ВСТАВИТИ, ОНОВИТИ та інші команди, що вимагають транзакцій, — це погано...
Деякі файли стверджують, що ефективність запитів SQL можна підвищити на 33% за допомогою WITH (NOLOCK). Додавання WITH (NOLOCK) повідомляє SQL Server, що наша команда SELECT не обов'язково враховує стан транзакційного блокування поточної таблиці, тому продуктивність значно покращиться, а феномен блокування системи баз даних значно зменшиться (включно з мертвим блокуванням).
Варто зазначити, що оскільки WITH (NOLOCK) не враховує блокування транзакції поточної таблиці, тож коли деякі дані знаходяться на кількох фазах транзакції (наприклад, транзакція між кількома таблицями — >, наприклад, система зняття коштів), WITH (NOLOCK) ігнорує дані, які зараз обробляють процес транзакції...
Простіше кажучи, при використанні NoLock він дозволяє читати дані, які були змінені, але транзакція ще не завершена. Тому, якщо вам потрібно враховувати цілісність транзакційних даних у реальному часі, варто ретельно подумати про використання WITH (NOLOCK).
Якщо вам не потрібно враховувати транзакції, WITH (NOLOCK) може бути корисним джерелом.
Примітка 1: З ( < table_hint > ) Визначає сканування таблиці, один або кілька індексів, які використовуються оптимізатором запитів, Або оптимізатор запитів, щоб використати цю таблицю даних і застосувати режим блокування для цього оператора.
Примітка 2: WITH (NOLOCK) еквівалентний READ UNCOMMITTED
Нарешті, давайте поговоримо про кілька невеликих відмінностей між nolock і with(nolock): 1: У SQL05 підтримуються синоніми лише з (nolock); 2: з (nolock) записується дуже просто, а потім вказує індекс. Під час запиту операторів між серверами не можна використовувати з (nolock), лише nolock Під час запиту на одному сервері можна використовувати як з (nolock), так і з nolock Наприклад, що саме SQL-код select * з [IP].a.dbo.table1 з (nolock) Це запросить вас з помилкою select * з a.dbo.table1 з (nolock) Це спрацює |