Widziałem, jak moi starsi programiści używali WITH (NOLOCK) podczas zapytań w SQL Server i zastanawiałem się, dlaczego tego używają. Teraz to zgłębiłem i odkryłem, że jest to przydatne do poprawy wydajności podczas wykonywania zapytania. Jednak używanie tego systemu ma też wadę. Minusem jest to, że można nie mieć pewności, czy otrzymuje dane, które są aktualnie aktualizowane w tabeli, czyli bez zabezpieczenia blokady nie można mieć gwarancji, że dane nie są zmienia się w trakcie działania zapytania. Sprawdziłem ten link i uznałem go za całkiem przydatny.
Aby poprawić wydajność zapytań SQL, ogólnie rzecz biorąc, pierwszym krokiem jest stworzenie indeksu. W rzeczywistości, oprócz ustalania indeksów, gdy umieszczamy polecenia SQL, dodanie sekcji WITH (NOLOCK) do składni może poprawić zjawisko LOCK-owania zbiorów danych w środowisku z dużą liczbą zapytań online, poprawiając tym samym wydajność zapytań.
Jednak warto zauważyć, że SQL SELECT z (NOLOCK) może powodować nieczytelne odczyty.
Na przykład:
Ponieważ SQL Server wykonuje odpowiednią kontrolę spójności blokady. Aby poprawić ogólną wydajność zapytań bazy danych, dodaj WITH (NOLOCK) do końca nazwy tabeli w składni SELECT, choć (NOLOCK) również jest akceptowalne, ale Microsoft nadal zaleca dodanie WITH.
Oprócz prostego SELECT możesz także użyć składni SELECT z JOIN. Ale DELETE, INSERT, UPDATE i inne polecenia wymagające transakcji nie są dobre...
Niektóre pliki twierdzą, że wydajność zapytań SQL można zwiększyć o 33% dzięki WITH (NOLOCK). Dodanie WITH (NOLOCK) informuje SQL Server, że nasze polecenie SELECT nie musi uwzględniać stanu blokady transakcji w bieżącej tabeli, więc wydajność zostanie znacznie poprawiona, a zjawisko blokady systemu bazodanowego znacznie ograniczone (w tym martwe zablokowanie).
Warto zauważyć, że ponieważ WITH (NOLOCK) nie uwzględnia blokady transakcji w bieżącej tabeli, więc gdy dane są w wielu fazach transakcji (np. transakcja w wielu tabelach – > jak system wypłat), WITH (NOLOCK) ignoruje dane, które obecnie przetwarzają proces transakcji...
Mówiąc wprost, używając NoLock, pozwala on odczytać dane, które zostały zmodyfikowane, ale transakcja jeszcze nie została zakończona. Dlatego jeśli musisz wziąć pod uwagę integralność danych transakcyjnych w czasie rzeczywistym, powinieneś dokładnie przemyśleć użycie WITH (NOLOCK).
Jeśli nie musisz brać pod uwagę transakcji, WITH (NOLOCK) może być przydatnym odniesieniem.
Notatka 1: WITH ( < table_hint > ) Określa skanowanie tabeli, jeden lub więcej indeksów używanych przez optymalizator zapytań, Albo przez optymalizator zapytań, aby wykorzystać tę tabelę danych i użyć trybu blokady dla tego zdania (lock).
Uwaga 2: WITH (NOLOCK) jest równoważne READ uncommitted
Na koniec porozmawiajmy o kilku drobnych różnicach między nolockiem a with(nolock): 1: Synonimy w SQL05 są obsługiwane tylko z (nolock); 2: z (nolock) zapisuje się bardzo łatwo, a następnie określa indeks. Podczas zapytań o instrukcje na serwerach nie można używać tylko z (nolock), tylko nolock Podczas zapytań na tym samym serwerze można używać zarówno (nolock), jak i nolocka Na przykład co Kod SQL wybierz * z [IP].a.dbo.table1 z (nolock) To poprosi o błąd select * z a.dbo.table1 z (nolock) To zadziała |