Chyba prawdziwe pytanie brzmi:
Jeśli nie przejmuję się brudnymi odczytami, dodanie wskazówki with (NOLOCK) do instrukcji SELECT wpłynie na wydajność:
- bieżąca instrukcja SELECT
- inne transakcje na podstawie podanej tabeli
Przykład:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Bob Probst
źródło
źródło
Odpowiedzi:
1) Tak , wybór z
NOLOCK
zakończy się szybciej niż normalny wybór.2) Tak , wybór za pomocą
NOLOCK
pozwoli na wykonanie innych zapytań względem wykonanej tabeli szybciej niż normalny wybór.Dlaczego miałoby to być?
NOLOCK
zazwyczaj (w zależności od silnika DB) oznacza, że podaj mi swoje dane, a ja nie dbam o to, w jakim jest stanie, i nie zawracam sobie głowy trzymaniem ich w miejscu podczas czytania. Wszystko to naraz jest szybsze, mniej zasobochłonne i bardzo bardzo niebezpieczne.Powinieneś zostać ostrzeżony, aby nigdy nie przeprowadzać aktualizacji ani nie wykonywać niczego krytycznego dla systemu lub gdy wymagana jest absolutna poprawność przy użyciu danych pochodzących z
NOLOCK
odczytu. Jest absolutnie możliwe, że dane te zawierają wiersze, które zostały usunięte podczas uruchamiania zapytania lub zostały usunięte w innych sesjach, które jeszcze nie zostały sfinalizowane. Możliwe, że dane te zawierają częściowo zaktualizowane wiersze. Możliwe, że dane te zawierają rekordy, które naruszają ograniczenia klucza obcego. Możliwe, że dane te nie obejmują wierszy, które zostały dodane do tabeli, ale nie zostały jeszcze zatwierdzone.Naprawdę nie masz sposobu, aby dowiedzieć się, jaki jest stan danych.
Jeśli próbujesz uzyskać takie dane, jak liczba wierszy lub inne dane podsumowujące, w których dopuszczalny jest pewien margines błędu,
NOLOCK
to dobry sposób na zwiększenie wydajności tych zapytań i uniknięcie negatywnego wpływu na wydajność bazy danych.Zawsze używaj
NOLOCK
podpowiedzi z wielką ostrożnością i traktuj wszelkie dane, które zwraca podejrzliwie.źródło
NOLOCK sprawia, że większość instrukcji SELECT jest szybsza z powodu braku współdzielonych blokad. Ponadto brak wydawania blokad oznacza, że Twój SELECT nie będzie utrudniał pisarzom.
NOLOCK jest funkcjonalnie równoważny poziomowi izolacji ODCZYTAJ NIEZGODNIE. Główną różnicą jest to, że możesz używać NOLOCK na niektórych stołach, ale nie na innych, jeśli chcesz. Jeśli planujesz używać NOLOCK na wszystkich tabelach w złożonym zapytaniu, wówczas użycie USTAW POZIOMU IZOLACJI ODCZYTAJ NIEZGODNE jest łatwiejsze, ponieważ nie musisz stosować podpowiedzi do każdej tabeli.
Oto informacje o wszystkich poziomach izolacji, jakie masz do dyspozycji, a także wskazówki dotyczące tabel.
USTAW POZIOM IZOLACJI TRANSAKCJI
Wskazówka do tabeli (Transact-SQL)
źródło
Oprócz tego, co powiedziano powyżej, powinieneś być bardzo świadomy, że nolock w rzeczywistości wiąże się z ryzykiem, że nie dostaniesz wierszy, które zostały popełnione przed wyborem .
Zobacz http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx
źródło
Będzie szybciej, ponieważ nie musi czekać na zamki
źródło
Odpowiedź brzmi Tak, jeśli zapytanie jest uruchamiane wiele razy jednocześnie, ponieważ każda transakcja nie będzie musiała czekać na zakończenie innych. Jeśli jednak zapytanie zostanie uruchomione samodzielnie, odpowiedź brzmi Nie.
Tak . Istnieje duże prawdopodobieństwo, że staranne użycie Z (NOLOCK) ogólnie przyspieszy twoją bazę danych. Oznacza to, że inne transakcje nie będą musiały czekać na zakończenie instrukcji SELECT, ale z drugiej strony inne transakcje zostaną spowolnione, ponieważ dzielą teraz swój czas przetwarzania z nową transakcją.
Uważaj, aby używać tylko
WITH (NOLOCK)
w instrukcjach SELECT w tabelach, które mają indeks klastrowany.Z (NOLOCK) jest często wykorzystywany jako magiczny sposób na przyspieszenie transakcji odczytu bazy danych.
Zestaw wyników może zawierać wiersze, które nie zostały jeszcze zatwierdzone, a które często są później wycofywane.
Jeśli Z (NOLOCK) zostanie zastosowane do tabeli, która ma indeks nieklastrowany, wówczas indeksy wierszy można zmienić za pomocą innych transakcji, ponieważ dane wiersza są przesyłane strumieniowo do tabeli wyników. Oznacza to, że w zestawie wyników może brakować wierszy lub wyświetlać ten sam wiersz wiele razy.
CZYTAJ ZOBOWIĄZANIE dodaje dodatkowy problem, w którym dane są uszkodzone w jednej kolumnie, w której wielu użytkowników zmienia tę samą komórkę jednocześnie.
źródło