Taulukon muutosten hallitseminen SQL Serverissä: Vaiheittainen opas
Joskus suurten tietojoukkojen kanssa työskentely voi tuntua siltä, että yrittäisit käsitellä sataa tehtävää kerralla. Äskettäin jouduin tilanteeseen, jossa minun piti lisätä sarake taulukkoon, joka sisältää yli miljoona riviä. Vaikka tämä vaikutti pinnalta yksinkertaiselta tehtävältä, törmäsin nopeasti monien SQL Server -käyttäjien kohtaamaan estoon: pelättyyn "Virheellinen sarakkeen nimi" -virhe. 🧐
Suoritettuani useita yrityksiä suorittaa ALTER TABLE- ja UPDATE-komennot yhdessä, tajusin, että ongelma ei johtunut logiikasta vaan kyselyjeni järjestyksestä. SQL Server edellyttää, että lisäät sarakkeen ensin ja vahvistat tämän muutoksen ennen kuin päivität sen tiedoilla. Jos näin ei tehdä, seurauksena on virhe, koska järjestelmä ei tunnista juuri lisättyä saraketta päivityksen suorittamishetkellä.
Kuvittele esimerkiksi, että sinun tehtäväsi on päivittää "IS_CURRENT" -lippu suuren asiakastietokannan tietyn päivämääräkynnyksen perusteella. Jos lisäät sarakkeen ja yrität päivittää rivit yhdessä komentosarjassa, SQL Server saattaa antaa virheellisen sarakkeen nimi -virheen. Tämä johtuu siitä, että saraketta ei ole täysin sitoutunut ennen kuin päivityskysely yrittää käyttää sitä. 🚀
Tässä artikkelissa käymme läpi oikean järjestyksen sarakkeen lisäämiseksi ja rivien päivittämiseksi, mikä varmistaa sujuvan suorituskyvyn myös suurilla tietojoukoilla. Sukellaan myös vinkkeihin SQL-skriptien optimoimiseksi käsittelemään miljoonia rivejä tehokkaasti ja varmistamaan, että tietotoiminnot toimivat ongelmitta. Pysy kuulolla, kun tutkimme vaiheita ja etsimme yleisiä ongelmia matkan varrella!
Komento | Käyttöesimerkki |
---|---|
ALTER TABLE | Tätä komentoa käytetään olemassa olevan taulukon rakenteen muokkaamiseen, kuten uusien sarakkeiden lisäämiseen. Esimerkiksi "ALTER TABLE dbo.sample ADD IS_CURRENT BIT;" lisää uuden sarakkeen nimeltä "IS_CURRENT" dbo.sample-taulukkoon. |
UPDATE | UPDATE-komentoa käytetään taulukon olemassa olevien tietueiden muokkaamiseen. Esimerkiksi `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
CAST | SQL Serverissä CAST-komentoa käytetään tietotyypin muuntamiseen toiseksi. Esimerkissä `CAST(DATEADD(month, DATEDIFF(kuukausi, 0, DATEADD(PÄIVÄ, -60, GETDATE())), 0) AS DATE)` muuntaa päivämäärän käsittelytuloksen päivämäärätyypiksi. |
DATEADD | Tätä toimintoa käytetään lisäämään päivämäärään tietty aikaväli. Esimerkiksi "DATEADD(DAY, -60, GETDATE())" vähentää 60 päivää nykyisestä päivämäärästä. |
DATEDIFF | `DATEDIFF`-funktio laskee kahden päivämäärän välisen eron. Tässä tapauksessa DATEDIFF(kuukausi, 0, GETDATE()) etsii kuukausien määrän peruspäivämäärän (0, joka on '1900-01-01') ja nykyisen päivämäärän välillä. |
BEGIN TRANSACTION | Tämä komento käynnistää tapahtumalohkon. Se on välttämätöntä sen varmistamiseksi, että useat SQL-käskyt suoritetaan yhtenä yksikkönä, mikä säilyttää tietojen eheyden. BEGIN TRANSACTION; aloittaa tapahtuman, ja kaikki muutokset voidaan sitoa tai peruuttaa. |
COMMIT TRANSACTION | Käytetään kaikkien tapahtuman aikana tehtyjen muutosten tallentamiseen tietokantaan. COMMIT TRANSACTION; varmistaa, että kaikki BEGIN TRANSACTION-lohkossa tehdyt muutokset viimeistellään ja säilytetään. |
UPDATE TOP | Tätä UPDATE-komennon versiota käytetään päivityksen vaikuttavien rivien määrän rajoittamiseen. Esimerkiksi `PÄIVITYS TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
EXEC msdb.dbo.sp_add_job | Tätä tallennettua toimintosarjaa käytetään SQL Server Agentissa uuden työn luomiseen. `EXEC msdb.dbo.sp_add_job @job_name = 'Päivitä IS_CURRENT työ';` luo työn, joka voidaan ajoittaa suorittamaan tiettyjä SQL-komentoja automaattisesti. |
SQL Server -komentojen ymmärtäminen taulukoiden muuttamiseen ja rivien päivittämiseen
Kun työskentelet SQL Serverin kanssa, erityisesti suuria tietojoukkoja sisältävien taulukoiden kanssa, on tärkeää noudattaa säännöllistä lähestymistapaa taulukon muuttamisessa ja sen rivien päivittämisessä. Yksi yleinen skenaario on lisätä uusi sarake taulukkoon ja päivittää sitten rivit tiettyjen ehtojen mukaan, kuten lipun asettaminen päivämäärien perusteella. Toimittamani skripti osoittaa yksinkertaisen lähestymistavan tähän, mutta se korostaa tärkeimmät SQL Server -komennot, jotka ovat välttämättömiä näiden tehtävien suorittamiseksi tehokkaasti. The MUUTTA TAULU -komentoa käytetään uuden sarakkeen lisäämiseen taulukkoon. Esimerkiksi kun suoritamme komennon "ALTER TABLE dbo.sample ADD IS_CURRENT BIT;", muokkaamme taulukkorakennetta lisäämään uuden sarakkeen nimeltä "IS_CURRENT", jonka tyyppi on "BIT" (looginen tyyppi, joko 0 tai 1).
Sarakkeen lisäämisen jälkeen seuraava vaihe on päivittää taulukon rivit tiettyjen ehtojen mukaan. Tämä saavutetaan käyttämällä PÄIVITTÄÄ komento. Esimerkiksi kysely `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
Joissakin tapauksissa, varsinkin kun käsitellään suuria, miljoonia rivejä sisältäviä taulukoita, on tärkeää varmistaa, että SQL-komennot suoritetaan tehokkaasti. Tässä toimii kuten PÄIVÄMÄÄRÄ ja DATEDIFF tulla peliin. Näiden toimintojen avulla voit käsitellä ja vertailla päivämääriä tarkasti. Toisessa päivityskyselyssä `DATEADD(month, DATEDIFF(kuukausi, 0, DATEADD(DAY, -60, GETDATE())), 0)' vähentää 60 päivää nykyisestä päivämäärästä (`GETDATE()`) ja nollaa aika kuun alkuun. Näiden toimintojen avulla voimme määrittää dynaamisempia ajanjaksoja, jotka mukautuvat ajan edetessä ja varmistavat, että tiedot pysyvät ajan tasalla myös ikääntyessään.
Kuitenkin, kun yhdistät sekä ALTER TABLE- että UPDATE-käskyt yhdeksi skriptiksi, SQL Server voi joskus antaa virheellisen sarakkeen nimi -virheen. Tämä johtuu siitä, että SQL Server ei välttämättä ole täysin sitoutunut tai tunnistanut ALTER TABLE:n lisäämää saraketta suorittaessaan myöhempiä kyselyitä samassa erässä. Ratkaisu tähän ongelmaan on erottaa ALTER TABLE -käsky ja UPDATE-komennot ja varmistaa, että taulukon muutos on täysin sitoutunut ennen päivitysten suorittamista. Näin tekemällä SQL Server rekisteröi uuden sarakkeen oikein skeemossaan, mikä mahdollistaa taulukon sujuvat päivitykset. Kun käsittelet suuria tietojoukkoja, harkitse näiden toimintojen suorittamista erissä tai tapahtumien käyttöä varmistaaksesi, että prosessi on mahdollisimman tehokas ja vältä mahdolliset aikakatkaisut tai lukitukset. 🚀
Ratkaisu 1: Tavallinen lähestymistapa taulukon muuttamiseen ja rivien päivittämiseen
Tämä ratkaisu sisältää SQL Server Management Studio (SSMS) -standardin mukaisen lähestymistavan, jossa lisäämme ensin sarakkeen ja päivitämme sitten rivit sopivilla ehdoilla. Suoritamme ALTER TABLE -käskyn ja sitomme sen ennen päivitysten suorittamista.
ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
GO
Ratkaisu 2: Optimoitu lähestymistapa käyttäen Transaction for Atomicity
Tämä ratkaisu varmistaa, että taulukon muokkaus ja rivipäivitykset tehdään atomaarisesti. Käärimällä toiminnot tapahtumaan varmistamme johdonmukaisuuden ja peruutuksen epäonnistumisen sattuessa.
BEGIN TRANSACTION;
ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
COMMIT TRANSACTION;
Ratkaisu 3: Käytä eräkäsittelyä suurille tietojoukoille
Kun käsitellään yli miljoona riviä sisältäviä taulukoita, on tärkeää minimoida lukitseminen ja pienentää tapahtumakokoa. Tämä ratkaisu käsittelee päivitykset pienemmissä erissä suorituskyvyn parantamiseksi ja aikakatkaisujen estämiseksi.
DECLARE @BatchSize INT = 10000;
DECLARE @RowCount INT;
SELECT @RowCount = COUNT(*) FROM dbo.sample WHERE IS_CURRENT IS ;
WHILE @RowCount > 0
BEGIN
UPDATE TOP (@BatchSize) dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01' AND IS_CURRENT IS ;
SET @RowCount = @RowCount - @BatchSize;
END
Ratkaisu 4: Indeksoitujen näkymien käyttö suorituskyvyn parantamiseen
Voit parantaa suorituskykyä tehtäessä kyselyitä suurista tietojoukoista luomalla indeksoituja näkymiä SQL Serverissä. Tämä lähestymistapa hyödyntää toteutuneita näkymiä monimutkaisten kyselyiden tulosten tallentamiseen, mikä vähentää toistuvan tietojenkäsittelyn tarvetta.
CREATE VIEW dbo.Sample_View AS
SELECT LOAD_DATE, IS_CURRENT
FROM dbo.sample
WHERE LOAD_DATE < '2025-01-01';
GO
CREATE UNIQUE CLUSTERED INDEX idx_sample_view ON dbo.Sample_View (LOAD_DATE);
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
FROM dbo.Sample_View v
WHERE dbo.sample.LOAD_DATE = v.LOAD_DATE;
GO
Ratkaisu 5: Ota käyttöön SQL Server Agent Jobs ajoitettuja päivityksiä varten
Jos sinun on päivitettävä taulukko ajoitetusti, SQL Server Agentin avulla voidaan luoda töitä, jotka suorittavat päivitysprosessin tietyin väliajoin, jolloin manuaalista suorittamista ei tarvita.
EXEC msdb.dbo.sp_add_job @job_name = 'Update IS_CURRENT Job';
EXEC msdb.dbo.sp_add_jobstep @job_name = 'Update IS_CURRENT Job',
@step_name = 'Update IS_CURRENT Step',
@subsystem = 'TSQL',
@command = 'UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE < ''2025-01-01'';',
@retry_attempts = 5, @retry_interval = 5;
EXEC msdb.dbo.sp_add_schedule @schedule_name = 'Daily Schedule',
@enabled = 1, @freq_type = 4, @freq_interval = 1, @active_start_time = 010000;
EXEC msdb.dbo.sp_attach_schedule @job_name = 'Update IS_CURRENT Job', @schedule_name = 'Daily Schedule';
EXEC msdb.dbo.sp_start_job @job_name = 'Update IS_CURRENT Job';
Komentosarjoissa käytettyjen erityisten SQL-komentojen selitys
SQL Server -komentosarjojen optimointi suurille taulukoille
Kun työskentelet suurten taulukoiden kanssa SQL Serverissä, on tärkeää ottaa huomioon suorituskyvyn optimointitekniikat, kun taulukkorakennetta muutetaan ja olemassa olevia rivejä päivitetään. Yksi yleisimmistä ongelmista suoritettaessa skriptejä suurissa taulukoissa on näiden toimintojen suorittamiseen kuluva aika, varsinkin kun taulukko sisältää yli miljoona riviä. Kyseiset toiminnot, kuten sarakkeen lisääminen MUUTTA TAULU komento ja rivien päivittäminen tiettyjen päivämääräehtojen perusteella, voi viedä huomattavasti aikaa. Näiden toimintojen optimoinnista tulee entistä tärkeämpää, kun työskentelet tuotantotietokannassa, jossa suorituskyky on etusijalla. Yksi komentosarja voi mahdollisesti lukita taulukon pitkäksi aikaa, mikä vaikuttaa muihin kyselyihin ja käyttäjiin.
Suorituskykyongelmien lieventämiseksi yksi parhaista tavoista on jakaa tehtävät pienempiin vaiheisiin. Esimerkiksi sen sijaan, että lisäisit sarakkeen ja päivittäisit kaikki rivit yhdessä skriptissä, harkitse ohjelman suorittamista MUUTTA TAULU -komento erikseen, jonka jälkeen jaksotetaan UPDATE toiminnot. Päivittämällä tietueita pienemmissä osissa komentosarja ei kuormita palvelinta. Voit hyödyntää UPDATE TOP komento rajoittaa kunkin tapahtuman vaikutusten rivien määrää. Lisäksi on myös hyvä idea luoda indeksejä käyttämissäsi sarakkeissa WHERE lausekkeet (esim LOAD_DATE) nopeuttaaksesi hakuprosessia. Suurille tietojoukoille hakemistot vähentävät aikaa, joka kuluu rivien suodattamiseen ajanjakson perusteella.
Toinen tärkeä näkökohta on tapahtumien ja virheiden käsittelyn käyttö sen varmistamiseksi, että toiminnot suoritetaan atomaarisesti. Käärimällä omasi UPDATE lausunnot sisällä a BEGIN TRANSACTION ja COMMIT, varmistat, että muutokset tehdään turvallisesti ja johdonmukaisesti. Jos jokin prosessin osa epäonnistuu, voit käyttää ROLLBACK peruuttaa muutokset ja estää osittaiset päivitykset. Lisäksi komentosarjojen suorittaminen ruuhka-aikoina tai SQL Server Agentin käyttäminen näiden toimintojen ajoittamiseen varmistaa minimaalisen vaikutuksen järjestelmän suorituskykyyn. Näiden optimointien avulla voit turvallisesti suorittaa monimutkaisia muutoksia suurissa taulukoissa säilyttäen samalla järjestelmän eheyden. 🖥️
Usein kysyttyjä kysymyksiä SQL Server -taulukon muutoksista
- Kuinka lisään uuden sarakkeen SQL Serverin taulukkoon?
- Voit lisätä uuden sarakkeen käyttämällä ALTER TABLE komento. Esimerkiksi: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; lisää sarakkeen nimeltä IS_CURRENT, jonka tietotyyppi on BIT.
- Kuinka voin päivittää vain tietyn rivialueen SQL Serverissä?
- Käytä UPDATE komento a:lla WHERE lauseke rivien suodattamiseksi. Esimerkki: PÄIVITYS dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- Miksi komentosarjani antaa virheellisen sarakkeen nimi -virheen?
- Tämä virhe ilmenee, jos ALTER TABLE komento ei ole täysin sitoutunut ennen kuin suoritetaan UPDATE lausunto. Voit välttää tämän suorittamalla ALTER TABLE komento ensin, odota, että sarake lisätään, ja suorita sitten UPDATE tiedustelut erikseen.
- Kuinka voin päivittää rivejä erissä suorituskyvyn parantamiseksi?
- Käytä UPDATE TOP -komento rajoittaa kerralla päivitettävien rivien määrää. Esimerkki: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- Voinko käyttää tapahtumaa atomipäivitysten varmistamiseksi?
- Kyllä! Kääri omasi UPDATE lausunnot kohdassa a BEGIN TRANSACTION ja COMMIT estääksesi, että kaikki päivitykset otetaan käyttöön yhtenä yksikkönä. Jos virheitä ilmenee, käytä ROLLBACK peruuttaaksesi muutokset.
- Mikä on paras tapa optimoida suurten päivitysten suorituskykyä SQL Serverissä?
- Harkitse päivityksen jakamista pienempiin osiin, indeksien luomista asianmukaisiin sarakkeisiin ja komentosarjan suorittamista ruuhka-aikoina. Lisäksi käyttämällä UPDATE TOP menetelmä auttaa välttämään lukitusongelmia ja vähentää resurssien kulutusta.
- Kuinka voin tehdä päivämäärävertailuista dynaamisempia SQL Serverissä?
- Käytä päivämäärätoimintoja, kuten DATEADD ja DATEDIFF tehdäksesi dynaamisia päivämäärälaskelmia. Jos haluat esimerkiksi asettaa päivämäärän 60 päivää sitten, käytä PÄIVÄMÄÄRÄ(PÄIVÄ, -60, GETDATE()).
- Mitä minun pitäisi tehdä, jos minun on päivitettävä miljoonia rivejä päivämäärän perusteella?
- Harkitse indeksoitujen sarakkeiden käyttöä tehokkuuden parantamiseksi. Lisäksi jaa päivityksesi pienempiin tapahtumiin ja käytä UPDATE TOP päivittääksesi rivejä erissä.
- Kuinka voin välttää lukitusongelmia, kun päivitän suurta taulukkoa?
- Estä lukitusongelmat jakamalla päivitykset pienempiin eriin, käyttämällä tapahtumia muutosten tekemiseen vaiheittain ja harkitsemalla päivityksen suorittamista vähäisen käytön aikana.
- Voinko ajoittaa suuria päivitysskriptejä SQL Serverissä?
- Kyllä, SQL Server Agent -agenttia voidaan käyttää suurten päivityskomentosarjojen ajoittamiseen ruuhka-aikojen ulkopuolella minimoimaan vaikutus järjestelmän suorituskykyyn. Luo työ SQL Server Agentissa ja aseta haluamasi aikataulu.
Suurien taulukkomuutosten optimointi SQL Serverissä
Kun työskentelet SQL Serverin kanssa suurten taulukoiden muokkaamiseen, toimintojen hajottaminen on avainasemassa suorituskyvyn parantamisessa. Sarakkeen lisääminen miljoonien rivien taulukkoon ja tietojen päivittäminen tiettyjen ehtojen perusteella voi olla haaste. Tämä vaatii strategista komentojen suorittamista, kuten MUUTTA TAULU ja UPDATE varmistaaksesi, että muutokset otetaan käyttöön kuormittamatta järjestelmää.
Lisäksi parhaiden käytäntöjen, kuten päivitysten eräajon, indeksoinnin ja komentosarjojen suorittamisen ruuhka-aikojen ulkopuolella, käyttöönotto voi auttaa estämään ongelmia, kuten taulukon lukitsemista ja suorituskyvyn heikkenemistä. Jakamalla työkuorman ja optimoimalla kyselyt voit turvallisesti tehdä suuria muutoksia aiheuttamatta seisokkeja tai virheitä, kuten "Virheellinen sarakkeen nimi". 💻
Viitteet ja lähteet
- Yksityiskohtaiset tiedot taulukoiden muuttamisesta ja tietojen päivittämisestä SQL Serverissä. Katso lisätietoja taulukoiden muuttamisesta ja parhaista käytännöistä Microsoft SQL Server -dokumentaatio .
- Tarjoaa näkemyksiä suurten taulukoiden kanssa työskentelystä ja SQL-komentojen optimoinnista SQL Shack .
- Selittää päivämääräpohjaisten ehdollisten päivitysten ja indeksoinnin tärkeyden SQL:ssä, saatavilla osoitteessa SQL Server Central .