Виждах как старшите ми разработчици използват WITH (NOLOCK), когато правят заявки в SQL Server, и се чудя защо го правят. Сега го разгледах и открих, че е полезен за подобряване на производителността при изпълнение на заявката. Въпреки това има недостатък при използването му. Недостатъкът е, че човек може да не е сигурен, че получава данните, които в момента се обновяват в таблицата, т.е. без защита от заключване не може да се гарантира, че данните не са променя се по време на изпълнението на заявката. Препратих този линк и го намерих доста полезен.
За да се подобри производителността на SQL заявките, общо взето, първото съображение е създаването на индекс. Всъщност, освен създаването на индекси, когато поставяме SQL команди, добавянето на секция WITH (NOLOCK) към синтаксиса може да подобри явлението на LOCK-ване на набори от данни в среда с голям брой онлайн заявки, като по този начин подобрява производителността на заявките.
Въпреки това, едно нещо, което трябва да се отбележи, е че SQL SELECT с (NOLOCK) може да причини мръсно четене.
Например:
Защото SQL Server извършва съответната проверка на съгласуваността на заключването. За да подобрите цялостната производителност на заявката в базата данни, добавете WITH (NOLOCK) в края на името на таблицата в SELECT синтаксиса, въпреки че (NOLOCK) също е приемливо, но Microsoft все пак препоръчва добавянето на WITH.
Освен простия SELECT, можеш да използваш и SELECT синтаксиса с JOIN. Но командите DELETE, INSERT, UPDATE и други, които изискват транзакции, не са добри...
Някои файлове казват, че ефективността на 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) Това ще работи |