Näin aiemmin vanhempien kehittäjieni käyttävän WITH:tä (NOLOCK) SQL Serverissä kyselyissä ja ihmettelin, miksi he käyttävät sitä. Tutkin sitä ja huomasin, että se on hyödyllistä kyselyn suorituskyvyn parantamisessa. Sen käytössä on kuitenkin haittapuoli. Haittapuolena on, että ei välttämättä ole varma, että saa dataa, jota parhaillaan päivitetään taulukossa, eli ilman lukitussuojaa ei voida taata, ettei data ole muuttuu kyselyn aikana. Viittasin tähän linkkiin ja pidin sitä melko hyödyllisenä.
SQL-kyselysuorituskyvyn parantamiseksi yleisesti ottaen ensimmäinen asia on indeksin luominen. Itse asiassa, indeksien perustamisen lisäksi, kun sijoitamme SQL-komentoja, syntaksiin lisätty osio WITH (NOLOCK) voi parantaa ilmiötä, jossa datasetit lukitaan ympäristössä, jossa on paljon verkkokyselyitä, parantaen näin kyselyjen suorituskykyä.
Kuitenkin yksi huomioitava asia on, että SQL SELECT (NOLOCK) voi aiheuttaa likaisen lukemisen.
Esimerkiksi:
Koska SQL Server suorittaa vastaavan lukituksen yhdenmukaisuustarkistuksen. Parantaaksesi tietokantakyselyjen suorituskykyä, lisää WITH (NOLOCK) SELECT-syntaksin taulun nimen loppuun, vaikka (NOLOCK) on myös hyväksyttävä, mutta Microsoft suosittelee silti lisäämään WITH:n.
Yksinkertaisen SELECT-toiminnon lisäksi voit käyttää SELECT-syntaksia JOIN-toiminnolla. Mutta DELETE, INSERT, UPDATE ja muut transaktioita vaativat komennot eivät toimi...
Jotkut tiedostot sanovat, että SQL-kyselyjen tehokkuutta voidaan parantaa 33 % WITH (NOLOCK) -toiminnolla. WITH (NOLOCK) lisääminen kertoo SQL Serverille, että SELECT-komennon ei tarvitse ottaa huomioon nykyisen taulukon transaktiolukituksen tilaa, joten suorituskyky paranee merkittävästi ja tietokantajärjestelmän lukitusilmiö vähenee merkittävästi (mukaan lukien kuollut lukko).
Yksi huomionarvoinen asia on, että koska WITH (NOLOCK) ei ota huomioon nykyisen taulukon transaktiolukkoa, niin kun transaktion useissa vaiheissa on dataa (esim. transaktio useiden taulujen välillä – > kuten nostojärjestelmä), WITH (NOLOCK) jättää huomiotta datan, joka käsittelee transaktioprosessia...
Suoraan sanottuna, eli NoLockia käytettäessä se mahdollistaa tietojen lukemisen, jos sitä on muokattu mutta tapahtuma ei ole vielä suoritettu. Siksi, jos sinun täytyy miettiä transaktiotietojen reaaliaikaista eheyttä, kannattaa harkita tarkkaan WITH (NOLOCK) käyttöä.
Jos sinun ei tarvitse harkita transaktioita, WITH (NOLOCK) voi olla hyödyllinen viite.
Huomautus 1: KANSSA ( < table_hint > ) Määrittelee taulukon skannauksen, yhden tai useamman hakemiston, jota kyselyoptimointi käyttää Tai kyselyoptimaattorin avulla hyödyntämään tätä datataulukkoa ja käyttämään lukitustilaa tälle lauseelle.
Huomautus 2: WITH (NOLOCK) vastaa READ UNCOMMITTED -arvoa
Lopuksi puhutaan muutamasta pienestä erosta nolockin ja with(nolockin) välillä: 1: Synonyymit SQL05:ssä, vain (nolock) on tuettu; 2: (nolock) kirjoitetaan hyvin helposti ja sitten määritellään indeksi. Kun haet lauseita palvelimien välillä, et voi käyttää (nolock):lla, vain nolockia Kun haetaan samalla palvelimella, voi käyttää sekä (nolock) että nolock -tiedostoja Mitä esimerkiksi. SQL-koodi valitse * from [IP].a.dbo.table1 with (nolock) Tämä pyytää sinua valitsemaan virheen * from a.dbo.table1 with (nolock) Tämä toimii |