Myytti, että PUDOTTAA ja KATKAISTA TAULUKKO Ei Kirjautunut

posted in: Articles | 0

on jatkuva myytti, SQL Server maailmassa, että molemmat DROP TABLE ja TRUNCATE TABLE komennot ovat ei-kirjautunut.

he eivät ole. Molemmat ovat täysin kirjautuneita, mutta tehokkaasti kirjautuneita.

Voit helposti todistaa tämän itsellesi., Ajaa seuraava koodi perustaa tietokantaan ja taulukko, ja näyttää, että meillä on 10 000 riviä meidän taulukossa:

Tulokset:

RowCount
—-
10000

Ja sitten seuraava koodi, joka katkaisee taulukon tapahtuman ja tarkistaa rivi count:

BEGIN TRAN;GOTRUNCATE TABLE ;GO SELECT COUNT (*) AS N'RowCount'FROM ;GO

Tulokset:

RowCount
—-
0

Nyt pöytä on tyhjä., Mutta en voi perua kauppa ja laittaa kaikki tiedot takaisin:

ROLLBACK TRAN;GO SELECT COUNT (*) AS N'RowCount'FROM ;GO

Tulokset:

RowCount
—-
10000

Selvästi TRUNCATE toiminnan on oltava kirjautuneena muuten perua operaatio ei toimi.

Joten mistä harhaluulo tulee?

Se tulee käyttäytyminen DROP ja TRUNCATE toiminnot suuria taulukoita., Ne ovat täydellinen lähes välittömästi, ja jos et katso tapahtumalokin käyttäen fn_dblog heti sen jälkeen, näet vain pieni määrä lokitietueet syntyy toiminnasta. Että pieni määrä ei korreloi koko taulukko on katkaistu tai pudonnut, joten se näyttää kuin jos DROP ja TRUNCATE toiminnot ovat ei-kirjautunut.

mutta he ovat täysin kirjautuneet, kuten edellä osoitin. Missä ovat operaatioiden lokitiedot?,

vastaus on, että lokitiedot luodaan, ei vain heti, mekanismilla nimeltä ”laskennallinen pudotus”, joka lisättiin SQL Server 2000 SP3: een.

kun taulukkoa pudotetaan tai typistetään, kaikki taulukkoa varten osoitetut tiedostosivut on deallocated.,uire yksinomainen jakaminen lukko määrin
Koetin sivu lukitse kunkin sivun verran (hankkia lukko yksityiskäyttötilassa, ja heti pudota, varmista, että kukaan muu on sivu lukittu)
Älä vapauta määrin lukko, jolla taataan, että kukaan muu ei voi käyttää sitä, missä määrin
Siirry seuraavalle määrin
End

Kuten kaikki määrin lukot pidettiin loppuun asti toiminta, ja jokainen lukko ottaa pieni määrä muistia, on mahdollista, että lock manager muisti loppuu, kun DROP tai TRUNCATE erittäin suuri pöytä tapahtunut., Jotkut SQL Server asiakkaat alkoivat löytää ne törmäsin out-of-muistin ehtoja SQL Server 2000: n, kuten taulukoita kasvoi erittäin suuri ja huomattavasti ylittänyt kasvu muistia.

laskennallinen pudota mekanismi simuloi DROP tai TRUNCATE operaation suorittaminen välittömästi vapauttamalla määrärahat pöydän ja laittamalla ne ’laskennallinen pudota jonossa’, myöhempää käsittelyä varten, jonka taustalla tehtävä. Tämä siirto-ja siirtotoiminto tuottaa vain kourallisen lokitietoja., Tämä on operaatio, joka tehdään ja rullataan takaisin minun koodi esimerkki edellä.
’laskennallinen pudota tausta tehtävä’ pyörii jopa muutaman sekunnin välein ja deallocates kaikki sivut ja laajuudet laskennallisen pudota jonossa pienissä erissä, jolla taataan, että toiminta ei lopu muisti. Nämä deallocations ovat kaikki täysin kirjautunut, mutta muista, että deallocating sivu täynnä tietoja tai indeksi kirjaa ei kirjaa yksittäisten poistaa näitä tietueita, vaan koko sivu on vain merkitty vapautettu asianomaisen PFS (Sivu Vapaata Tilaa) jako tavu-kartta.,

SQL Server 2000 SP3 lähtien, kun suoritat DROP tai TRUNCATE taulukon, näet vain muutaman lokitietueet syntyy. Jos odotat noin minuutin, ja sitten katsoa tapahtumaloki uudelleen, näet tuhansia lokitietoja on luotu lykätty-drop toiminta, jokainen deallocating sivun tai laajuuden. Toiminta on täysin ja tehokkaasti Kirjautunut.,

Tässä on esimerkki käyttäen skenaario loimme edellä:

CHECKPOINT;GOTRUNCATE TABLE ;GOSELECT COUNT (*) AS N'LogRecCount'FROM fn_dblog (NULL, NULL);GO

Tulokset:

LogRecCount
—-
25

Kuten näette, on selvästi eivät ole lokitietueet deallocating 10 000 sivua, plus 1,250 laajuudet vuonna TestTable taulukko.

Jos odotan muutaman sekunnin, ja sitten ajaa fn_dblog koodi uudelleen, saan:

LogRecCount
—-
3811

saatat ihmetellä, miksi ei ole vähintään 10 000 log records – yksi jokaiselle sivulle on vapautettu., Se on, koska sivun deallocations ovat vielä kirjautunut tehokkaasti – yksi kirjaa mikä PFS sivun jakamisen muutokset 8 peräkkäistä data file-sivuja, yhden sijasta log record jokainen tiedot tiedosto-sivun heijastaa sen kohdentaminen status muuttuu PFS-sivulla.

SQL Server pyrkii aina tuottamaan mahdollisimman vähän tapahtumalokin kuin mahdollista, mutta silti noudattaa sääntöjä siitä täyden tai osittaisen hakkuut perustuu nykyinen elpyminen malli., Jos haluat tarkastella todellinen log records tuottama irrota-ja-siirto ja laskennalliset pudota mekanismeja, yksinkertaisesti korvata * COUNT (*) vuonna fn_dblog koodi edellä ja etsiä kauppa, jossa Kaupan Nimi on asetettu DeferredAllocUnitDrop::Process.

tulevaisuudessa virkaa, minä keskustella sisäosat, jotka tukevat muita pysyviä myyttejä noin suorituskykyä puolia SQL Server Storage Engine.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *