Dříve jsem viděl, jak moji zkušení vývojáři používají WITH (NOLOCK) při dotazování v SQL Serveru a divím se, proč je používají. Teď jsem to prozkoumal a zjistil, že je užitečné pro zlepšení výkonu při provádění dotazu. Nicméně jeho používání má nevýhodu. Nevýhodou je, že si nemusíte být jisti, zda dostáváte data, která jsou právě aktualizována v tabulce, tj. Bez ochrany zámku nelze mít jistotu, že data nejsou mění se během doby, kdy dotaz běží. Odkázal jsem na tento odkaz a přišel mi docela užitečný.
Pro zlepšení výkonu SQL dotazů je obecně prvním cílem vytvořit index. Ve skutečnosti, kromě nastavení indexů, když umístíme SQL příkazy, může přidání sekce WITH (NOLOCK) do syntaxe zlepšit fenomén LOCKování datových sad v prostředí s velkým počtem online dotazů, čímž se zlepšuje výkon dotazů.
Nicméně je třeba si uvědomit, že SQL SELECT s (NOLOCK) může způsobit špatné čtení.
Například:
Protože SQL Server provádí odpovídající kontrolu konzistence zámků. Pro zlepšení celkového výkonu databázových dotazů přidejte WITH (NOLOCK) na konec názvu tabulky ve své syntaxi SELECT, i když (NOLOCK) je také přijatelné, ale Microsoft stále doporučuje přidat WITH.
Kromě jednoduchého SELECT můžete také použít syntaxi SELECT s JOIN. Ale příkazy DELETE, INSERT, UPDATE a další příkazy, které vyžadují transakce nejsou dobré...
Některé soubory uvádějí, že efektivitu SQL dotazů lze zvýšit o 33 % pomocí WITH (NOLOCK). Přidání WITH (NOLOCK) říká SQL Serveru, že příkaz SELECT nemusí zohledňovat stav uzamčení transakce v aktuální tabulce, takže výkon bude výrazně zlepšen a jevy zámků databázového systému budou výrazně sníženy (včetně mrtvého zácpu).
Jedna věc, kterou je třeba poznamenat, je, že protože WITH (NOLOCK) nezohledňuje zámek transakce v aktuální tabulce, takže když jsou některá data ve více fázích transakce (např. transakce přes více tabulek – > například systém výběru), WITH (NOLOCK) ignoruje data, která právě zpracovávají proces transakce...
Jednoduše řečeno, při použití NoLocku umožňuje číst data, která byla upravena, ale transakce ještě nebyla dokončena. Pokud tedy potřebujete zvážit integritu transakčních dat v reálném čase, měli byste pečlivě zvážit použití WITH (NOLOCK).
Pokud nemusíte brát v úvahu transakce, může být užitečným zdrojem WITH (NOLOCK).
Poznámka 1: WITH ( < table_hint > ) Specifikuje skenování tabulky, jeden nebo více indexů používaných optimalizátorem dotazu, Nebo optimalizátorem dotazů, který využívá tuto datovou tabulku a používá režim zámku pro tento výrok.
Poznámka 2: WITH (NOLOCK) je ekvivalentní READ UNCOMMITTED
Nakonec si pojďme promluvit o několika drobných rozdílech mezi nolockem a with(nolock): 1: Synonyma v SQL05 jsou podporována pouze s (nolock); 2: s (nolock) se zapisuje velmi snadno a pak se specifikuje index. Při dotazování příkazů napříč servery nelze použít pouze s (nolock), pouze nolock Při dotazování na stejném serveru lze použít jak (nolock), tak nolock Jako co SQL kód select * from [IP].a.dbo.table1 s (nolock) To vás vyzve k chybě select * from a.dbo.table1 with (nolock) Toto bude fungovat |