Kedysi som videl, že moji skúsení vývojári používajú WITH (NOLOCK) pri dotazovaní v SQL Serveri a čudujem sa, prečo ich používajú. Teraz som to preskúmal a zistil som, že je to užitočné na zlepšenie výkonu pri vykonávaní dotazu. Avšak jeho používanie má aj nevýhodu. Nevýhodou je, že si človek nemusí byť istý, či dostáva dáta, ktoré sa práve aktualizujú v tabuľke, teda bez ochrany zámku nemôžete mať istotu, že údaje nie sú mení sa počas bežiaceho dopytu. Odkázal som na tento odkaz a považoval som ho za celkom užitočný.
Na zlepšenie výkonu SQL dotazov je vo všeobecnosti prvou úvahou vytvorenie indexu. V skutočnosti, okrem vytvorenia indexov, keď umiestňujeme SQL príkazy, pridanie sekcie WITH (NOLOCK) do syntaxe môže zlepšiť fenomén LOCKovania dátových súborov v prostredí s veľkým počtom online dotazov, čím sa zlepšuje výkon dotazov.
Avšak treba si uvedomiť, že SQL SELECT s (NOLOCK) môže spôsobiť nekvalitné čítanie.
Napríklad:
Pretože SQL Server vykonáva zodpovedajúcu kontrolu konzistencie zámku. Pre zlepšenie celkového výkonu databázových dotazov pridajte WITH (NOLOCK) na koniec názvu tabuľky vo vašej syntaxi SELECT, hoci (NOLOCK) je tiež prijateľné, ale Microsoft stále odporúča pridať WITH.
Okrem jednoduchého SELECT môžete použiť aj syntax SELECT s JOIN. Ale príkazy DELETE, INSERT, UPDATE a ďalšie príkazy, ktoré vyžadujú transakcie, nie sú dobré...
Niektoré súbory uvádzajú, že efektivita SQL dotazov sa dá zvýšiť o 33 % pomocou WITH (NOLOCK). Pridaním WITH (NOLOCK) hovorí SQL Serveru, že náš príkaz SELECT nemusí zohľadňovať stav uzamknutia transakcie v aktuálnej tabuľke, takže výkon sa výrazne zlepší a jav zámkov databázového systému sa výrazne zníži (vrátane slepého zámku).
Jedna vec, ktorú treba poznamenať, je, že keďže WITH (NOLOCK) nezohľadňuje transakčný zámok aktuálnej tabuľky, takže keď sú niektoré údaje vo viacerých fázach transakcie (napr. transakcia cez viacero tabuliek – > napríklad systém výberu), WITH (NOLOCK) ignoruje dáta, ktoré práve spracúvajú proces transakcie...
Jednoducho povedané, pri použití NoLocku umožňuje čítať dáta, ktoré boli upravené, ale transakcia ešte nebola dokončená. Preto, ak potrebujete zohľadniť integritu transakčných dát v reálnom čase, mali by ste dôkladne zvážiť použitie WITH (NOLOCK).
Ak nemusíte brať do úvahy transakcie, WITH (NOLOCK) môže byť užitočnou referenciou.
Poznámka 1: WITH ( < table_hint > ) Špecifikuje prehľad tabuľky, jeden alebo viac indexov používaných optimalizátorom dotazu, Alebo optimalizátorom dotazov, ktorý využije túto dátovú tabuľku a použije režim zámku pre tento výrok.
Poznámka 2: WITH (NOLOCK) je ekvivalentné READ uncommitted
Nakoniec sa poďme porozprávať o niekoľkých malých rozdieloch medzi nolockom a with(nolock): 1: Synonymá v SQL05 sú podporované iba s (nolock); 2: s (nolock) sa zapíše veľmi jednoducho a potom sa zadá index. Pri dotazovaní príkazov naprieč servermi nemôžete použiť s (nolock), iba nolock Pri dotazovaní na tom istom serveri je možné použiť oba formáty (nolock) aj nolock Ako čo SQL kód select * from [IP].a.dbo.table1 pomocou (nolock) Toto vás vyzve na chybu select * z a.dbo.table1 s (nolock) Toto bude fungovať |