SQL Server optimoi Päivityskyselyt suurille Tietomäärille

hyvin suurten taulukoiden päivittäminen voi olla aikaa vievä tehtävä ja joskus saattaa kestää tunteja. Tämän lisäksi se saattaa aiheuttaa myös esto-ongelmia.

Tässä muutamia vinkkejä SQL Serverin päivitysten optimointiin suurten tietomäärien osalta.

  1. poistetaan Hakemisto päivitettävästä sarakkeesta.
  2. päivityksen suorittaminen pienemmissä erissä.
  3. poistamalla Delete-käynnistimet käytöstä.
  4. päivitysilmoituksen korvaaminen Bulk-Insert-toiminnolla.

näin ollen, sovelletaanpa yllä olevia kohtia optimoidaksesi päivityskyselyn.

alla oleva koodi luo valetaulukon, jossa on 200 000 riviä ja tarvittavat indeksit.

CREATE TABLE tblverylargetable ( sno INT IDENTITY, col1 CHAR(800), col2 CHAR(800), col3 CHAR(800) ) GO DECLARE @i INT=0 WHILE( @i < 200000 ) BEGIN INSERT INTO tblverylargetable VALUES ('Dummy', Replicate('Dummy', 160), Replicate('Dummy', 160)) SET @i=@i + 1 ENDGOCREATE INDEX ix_col1 ON tblverylargetable(col1) GO CREATE INDEX ix_col2_col3 ON tblverylargetable(col2) INCLUDE(col3)

harkitse seuraavaa päivityskyselyä, joka on optimoitava. Yhden palstan päivittäminen on suoraviivaista kyselyä.

UPDATE tblverylargetable SET col1 = 'D'WHERE col1 = 'Dummy'

kyselyn suorittaminen kestää 2:19 minuuttia.

Katsotaanpa alla olevan kyselyn toteutussuunnitelmaa. Ryhmitetyn indeksipäivityksen lisäksi myös indeksi ix_col1 päivittyy. Indeksin päivitys ja lajittelu yhdessä vievät 64% toteutuskustannuksista.

1_SQL_Server_Optimizing_Update_Queries_for_Large_Data_Volumes

1. Poistetaan indeksi päivitettävästä sarakkeesta

sama kysely kestää 14-18 sekuntia, kun ei ole mitään indeksiä col1. Näin päivityskysely toimii nopeammin, jos päivitettävä sarake ei ole indeksiavain-sarake. Indeksin voi aina luoda, kun päivitys on valmis.

2. Päivityksen suorittaminen pienemmissä erissä

kyselyä voidaan edelleen optimoida suorittamalla se pienemmissä erissä. Tämä on yleensä nopeampaa. Alla oleva koodi päivittää tietueet 20000: n erissä.

DECLARE @i INT=1 WHILE( @i <= 10 ) BEGIN UPDATE TOP(20000) tblverylargetable SET col1 = 'D' WHERE col1 = 'Dummy' SET @i=@i + 1 END

yllä olevan kyselyn suorittaminen kestää 6-8 sekuntia. Kun päivität erissä, vaikka päivitys epäonnistuisi tai se pitäisi pysäyttää, vain rivit nykyisestä erästä vieritetään takaisin.

3. Delete-käynnistimien poistaminen käytöstä

kirsoreilla voi hidastaa poistokyselyn suorituskykyä erittäin paljon. Poistaminen käytöstä poistamisen jälkeen laukaisee huomattavasti lisätä kyselyn suorituskykyä.

4. Päivityslausekkeen korvaaminen Bulk-Insert-toiminnolla

päivityslauseke on täysin kirjattu toiminto, joten miljoonien rivien päivittäminen vie varmasti paljon aikaa.Nopein tapa nopeuttaa päivityskyselyä on korvata se bulk-insert-toiminnolla. Se on minimaalisesti Kirjautunut toiminta yksinkertainen ja irtotavarana Kirjautunut elpyminen malli. Tämä voidaan tehdä helposti tekemällä irtotavarana-lisää uuteen taulukkoon ja nimeä taulukko alkuperäiseksi. Tarvittavat indeksit ja rajoite voidaan luoda uudelle taulukolle tarpeen mukaan.

alla oleva koodi kertoo, miten päivitys voidaan muuntaa bulk-insert-toiminnoksi. Se kestää 4 sekuntia suorittaa.

SELECT sno, CASE col1 WHEN 'Dummy' THEN 'D' ELSE col1 END AS col1, col2, col3 INTO tblverylargetabletemp FROM tblverylargetable

bulk-insertti voidaan optimoida edelleen lisätehon saamiseksi.

Toivottavasti tämä auttaa!!!

Tykkää meistä Facebookissa | Seuraa meitä Twitterissä / liity Facebookista Facebookiin nopeimmin kasvavaan SQL Server-ryhmään

Leave a Reply

Sähköpostiosoitettasi ei julkaista.