Tabelite muudatuste valdamine SQL Serveris: samm-sammult juhend
Mõnikord võib suurte andmekogumitega töötamine tunduda nagu prooviks žongleerida saja ülesandega korraga. Hiljuti leidsin end olukorrast, kus mul oli vaja lisada veerg tabelisse, mis sisaldab üle miljoni rea. Kuigi see tundus pealtnäha lihtsa ülesandena, sattusin kiiresti teetõkkesse, millega paljud SQL Serveri kasutajad silmitsi seisavad: kardetud veaga „Veeru kehtetu nimi”. 🧐
Pärast mitut katset käivitada käske ALTER TABLE ja UPDATE, mõistsin, et probleem ei olnud mitte loogikas, vaid minu päringute järjestuses. SQL Server nõuab, et lisate kõigepealt veeru ja kinnitate selle muudatuse enne selle värskendamist mis tahes andmetega. Kui seda ei tehta, tekib tõrge, kuna süsteem ei tunne värskenduse käivitamise ajal äsja lisatud veergu.
Kujutage näiteks ette, et teie ülesandeks on värskendada lipu "IS_CURRENT" konkreetse kuupäevaläve alusel suure kliendiandmebaasi jaoks. Kui lisate veeru ja proovite värskendada ridu ühes skriptis, võib SQL Server kuvada veateate "Veeru kehtetu nimi". Selle põhjuseks on asjaolu, et veerg ei ole täielikult kinnitatud enne, kui värskenduspäring proovib seda kasutada. 🚀
Selles artiklis käsitleme veeru lisamise ja ridade värskendamise õiget järjestust, tagades sujuva täitmise isegi suurte andmekogumite korral. Samuti käsitleme näpunäiteid SQL-skriptide optimeerimiseks, et hallata tõhusalt miljoneid ridu, tagades teie andmetoimingute tõrgeteta toimimise. Olge kursis, kui uurime samme ja otsime levinumaid probleeme!
Käsk | Kasutusnäide |
---|---|
ALTER TABLE | Seda käsku kasutatakse olemasoleva tabeli struktuuri muutmiseks, näiteks uute veergude lisamiseks. Näiteks „ALTER TABLE dbo.sample ADD IS_CURRENT BIT;” lisab tabelisse „dbo.sample” uue veeru nimega „IS_CURRENT”. |
UPDATE | Käsku "UPDATE" kasutatakse tabelis olemasolevate kirjete muutmiseks. Näiteks `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
CAST | SQL Serveris kasutatakse CAST-i ühe andmetüübi teisendamiseks. Näites `CAST(DATEADD(month, DATEDIFF(kuu, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE)` teisendab kuupäevaga manipuleerimise tulemuse kuupäevatüübiks. |
DATEADD | Seda funktsiooni kasutatakse kuupäevale kindla ajavahemiku lisamiseks. Näiteks 'DATEADD(DAY, -60, GETDATE())' lahutab praegusest kuupäevast 60 päeva. |
DATEDIFF | Funktsioon DATEDIFF arvutab kahe kuupäeva erinevuse. Sel juhul otsib DATEDIFF(kuu, 0, GETDATE()) kuude arvu baaskuupäeva (0, mis on '1900-01-01') ja praeguse kuupäeva vahel. |
BEGIN TRANSACTION | See käsk käivitab tehinguploki. See on oluline tagamaks, et mitu SQL-lauset täidetakse ühe üksusena, säilitades andmete terviklikkuse. 'BEGIN TRANSACTION;' alustab tehingut ja kõik muudatused saab kinnistada või tagasi võtta. |
COMMIT TRANSACTION | Kasutatakse kõigi tehingu käigus tehtud muudatuste salvestamiseks andmebaasi. 'COMMIT TRANSACTION;' tagab, et kõik plokis 'BEGIN TRANSACTION' tehtud muudatused viiakse lõpule ja jäävad kehtima. |
UPDATE TOP | Seda käsu UPDATE versiooni kasutatakse värskendusest mõjutatud ridade arvu piiramiseks. Näiteks `UPDATE TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
EXEC msdb.dbo.sp_add_job | Seda salvestatud protseduuri kasutatakse SQL Server Agentis uue töö loomiseks. `EXEC msdb.dbo.sp_add_job @job_name = 'Uuenda IS_CURRENT tööd';` loob töö, mida saab ajastada konkreetsete SQL-käskude automaatseks käivitamiseks. |
SQL Serveri käskude mõistmine tabelite muutmiseks ja ridade värskendamiseks
SQL Serveriga töötamisel, eriti suuri andmekogumeid sisaldavate tabelitega, on ülioluline järgida korrapärast lähenemist tabeli muutmisel ja selle ridade värskendamisel. Üks levinud stsenaarium on see, et tabelisse tuleb lisada uus veerg ja seejärel värskendada ridu konkreetsete tingimuste alusel, näiteks kuupäevade alusel lipu määramine. Minu esitatud skript demonstreerib lihtsat lähenemist sellele, kuid toob esile peamised SQL Serveri käsud, mis on nende ülesannete tõhusaks täitmiseks hädavajalikud. The ALTER TABLE käsku kasutatakse tabelisse uue veeru lisamiseks. Näiteks kui käivitame käsu „ALTER TABLE dbo.sample ADD IS_CURRENT BIT;”, muudame tabeli struktuuri, et tutvustada uut veergu nimega „IS_CURRENT”, mille tüüp on „BIT” (tõve tüüp, kas 0 või 1).
Pärast veeru lisamist tuleb järgmise sammuna teatud tingimustel tabeli ridu värskendada. See saavutatakse kasutades VÄRSKENDAMINE käsk. Näiteks päring `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
Mõnel juhul, eriti kui tegemist on suurte tabelitega, mis sisaldavad miljoneid ridu, on oluline tagada SQL-käskude tõhus täitmine. See on koht, kus funktsioonid nagu KUUPÄEV LISA ja DATEDIFF mängu tulla. Need funktsioonid võimaldavad teil kuupäevi täpselt manipuleerida ja võrrelda. Teises värskenduspäringus lahutab `DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0)' praegusest kuupäevast (`GETDATE()) 60 päeva ja lähtestab aega kuu alguseni. Neid funktsioone kasutades saame määratleda dünaamilisemad kuupäevavahemikud, mis aja edenedes kohanduvad, tagades andmete ajakohasuse isegi vananedes.
Kui aga kombineerida nii ALTER TABLE kui ka UPDATE laused üheks skriptiks, võib SQL Server mõnikord esitada veateate "Veeru kehtetu nimi". Selle põhjuseks on asjaolu, et SQL Server ei pruugi sama partii järgmiste päringute täitmisel veergu ALTER TABLE lisatud veergu täielikult siduda ega tuvastada. Selle probleemi lahenduseks on eraldada lause ALTER TABLE ja käsud UPDATE, tagades, et tabeli muutmine on enne värskenduste tegemist täielikult vastu võetud. Seda tehes registreerib SQL Server uue veeru oma skeemis korralikult, mis võimaldab tabelit sujuvalt värskendada. Suurte andmehulkade käsitlemisel kaaluge nende toimingute sooritamist partiidena või tehingute kasutamist, et tagada protsessi võimalikult tõhus toimimine, vältides võimalikke ajalõppusid või lukke. 🚀
Lahendus 1: tavapärane lähenemine tabeli muutmiseks ja ridade värskendamiseks
See lahendus hõlmab standardset lähenemist SQL Server Management Studio (SSMS) abil, kus esmalt lisame veeru ja seejärel värskendame ridu sobivate tingimustega. Käitame avalduse ALTER TABLE ja kinnitame selle enne värskenduste tegemist.
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
Lahendus 2: optimeeritud lähenemine, kasutades tehingut aatomilisuse jaoks
See lahendus tagab, et tabeli muutmine ja ridade värskendamine toimub järjestikku. Pakkides toimingud tehingusse, tagame järjepidevuse ja ebaõnnestumise korral tagasilöögi.
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;
Lahendus 3: kasutage suurte andmekogumite jaoks paketttöötlust
Üle miljoni rea sisaldavate tabelitega tegelemisel on oluline minimeerida lukustamist ja vähendada tehingu mahtu. See lahendus töötleb värskendusi väiksemate partiidena, et parandada jõudlust ja vältida ajalõppusid.
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
Lahendus 4: indekseeritud vaadete kasutamine jõudluse parandamiseks
Suurte andmekogumite päringute tegemisel jõudluse parandamiseks saate luua SQL Serveris indekseeritud vaateid. See lähenemisviis kasutab keerukate päringute tulemuste salvestamiseks materialiseeritud vaateid, vähendades vajadust korduva andmetöötluse järele.
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
Lahendus 5. Lähenege ajastatud värskenduste jaoks SQL Server Agent Jobs'iga
Kui teil on vaja tabelit ajakava alusel värskendada, saab SQL Server Agenti kasutada tööde loomiseks, mis käivitavad värskendusprotsessi kindlate ajavahemike järel, vältides käsitsi käivitamise vajadust.
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';
Skriptides kasutatavate spetsiifiliste SQL-käskude selgitus
SQL Serveri skriptide optimeerimine suurte tabelite jaoks
SQL Serveris suurte tabelitega töötades on tabeli struktuuri muutmisel ja olemasolevate ridade värskendamisel oluline arvestada jõudluse optimeerimise tehnikatega. Üks levinumaid probleeme suurtes tabelites skriptide käitamisel on nende toimingute lõpuleviimiseks kuluv aeg, eriti kui tabel sisaldab üle miljoni rea. Kõnealused toimingud, näiteks veeru lisamine ALTER TABLE käsk ja ridade värskendamine konkreetsete kuupäevatingimuste alusel võib võtta palju aega. Nende toimingute optimeerimine muutub veelgi olulisemaks, kui töötate tootmisandmebaasidega, kus jõudlus on prioriteet. Üks skript võib tabeli pikemaks ajaks lukustada, mõjutades teisi päringuid ja kasutajaid.
Jõudlusprobleemide leevendamiseks on üks parimaid lähenemisviise ülesannete jaotamine väiksemateks sammudeks. Näiteks ühe skripti veeru lisamise ja kõigi ridade värskendamise asemel kaaluge rakenduse käivitamist ALTER TABLE käsk eraldi, millele järgneb pakkimine UPDATE operatsioonid. Värskendades kirjeid väiksemate tükkidena, ei koorma skript serverit üle. Saate võimendada UPDATE TOP käsk, et piirata iga tehingu puhul mõjutatud ridade arvu. Lisaks on hea mõte luua ka oma veergudele indeksid WHERE klauslid (nagu LOAD_DATE) otsinguprotsessi kiirendamiseks. Suurte andmekogumite puhul vähendavad indeksid kuupäevavahemike alusel ridade filtreerimiseks kuluvat aega.
Teine oluline kaalutlus on tehingute kasutamine ja vigade käsitlemine, et tagada toimingute aatomiline täitmine. Pakkides oma UPDATE avaldused a sees BEGIN TRANSACTION ja COMMIT, tagate muudatuste tegemise ohutul ja järjepideval viisil. Kui mõni protsessi osa ebaõnnestub, saate seda kasutada ROLLBACK muudatuste tagasivõtmiseks, vältides osalisi värskendusi. Lisaks tagab skriptide käitamine väljaspool tipptundi või SQL Server Agenti kasutamine nende toimingute ajastamiseks minimaalse mõju süsteemi jõudlusele. Nende optimeerimiste abil saate turvaliselt teostada keerulisi muudatusi suurtes tabelites, säilitades samal ajal süsteemi terviklikkuse. 🖥️
Korduma kippuvad küsimused SQL Serveri tabelite muutmise kohta
- Kuidas lisada SQL Serveris tabelisse uut veergu?
- Saate lisada uue veeru, kasutades ALTER TABLE käsk. Näiteks: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; lisab veeru nimega IS_CURRENT andmetüübiga BIT.
- Kuidas saan SQL Serveris värskendada ainult kindlat rida ridu?
- Kasutage UPDATE käsk a-ga WHERE klausel ridade filtreerimiseks. Näiteks: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- Miks kuvab mu skript veateate "Veeru kehtetu nimi"?
- See viga ilmneb, kui ALTER TABLE käsk pole enne käsu käivitamist täielikult vastu võetud UPDATE avaldus. Selle vältimiseks käivitage ALTER TABLE esmalt käsk, oodake, kuni veerg lisatakse, ja seejärel käivitage käsk UPDATE päringud eraldi.
- Kuidas saab jõudluse parandamiseks värskendada ridu partiidena?
- Kasutage UPDATE TOP käsk, et piirata korraga värskendatavate ridade arvu. Näiteks: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- Kas ma saan kasutada tehingut tuumavärskenduste tagamiseks?
- Jah! Pakkige oma UPDATE avaldused a BEGIN TRANSACTION ja COMMIT blokeerida, et kõik värskendused rakendataks ühe üksusena. Kui ilmnevad vead, kasutage ROLLBACK muudatuste tühistamiseks.
- Mis on parim viis suurte värskenduste toimivuse optimeerimiseks SQL Serveris?
- Kaaluge värskenduse jagamist väiksemateks tükkideks, asjakohastele veergudele indeksite loomist ja skripti käitamist tipptundidel. Lisaks kasutades UPDATE TOP meetod aitab vältida lukustusprobleeme ja vähendab ressursikulu.
- Kuidas saan kuupäevade võrdlusi SQL Serveris dünaamilisemaks muuta?
- Kasutage kuupäevafunktsioone nagu DATEADD ja DATEDIFF dünaamiliste kuupäevaarvutuste tegemiseks. Näiteks 60 päeva taguse kuupäeva määramiseks kasutage DATEADD(DAY, -60, GETDATE()).
- Mida peaksin tegema, kui pean kuupäeva alusel värskendama miljoneid ridu?
- Parema toimivuse saavutamiseks kaaluge indekseeritud veergude kasutamist. Lisaks jagage oma värskendus väiksemateks tehinguteks ja kasutage UPDATE TOP ridade värskendamiseks partiidena.
- Kuidas vältida lukustusprobleeme suure tabeli värskendamisel?
- Lukustusprobleemide vältimiseks proovige jagada värskendused väiksemateks partiideks, kasutada tehinguid muudatuste tegemiseks etapiviisiliselt ja kaaluda värskenduse käivitamist vähese kasutusega tundidel.
- Kas ma saan ajastada SQL Serveris suuri värskendusskripte?
- Jah, SQL Server Agenti saab kasutada suurte värskendusskriptide ajastamiseks tipptundidel, et minimeerida mõju süsteemi jõudlusele. Looge SQL Server Agentis töö ja määrake soovitud ajakava.
Suurte tabelimuudatuste optimeerimine SQL Serveris
Kui töötate SQL Serveriga suurte tabelite muutmiseks, on toimingute jaotamine jõudluse parandamiseks võtmetähtsusega. Miljonite ridadega tabelisse veeru lisamine ja konkreetsete tingimuste alusel andmete värskendamine võib olla väljakutse. See nõuab selliste käskude strateegilist täitmist nagu ALTER TABLE ja UPDATE et tagada muudatuste rakendamine ilma süsteemi ülekoormamata.
Lisaks võib parimate tavade (nt värskenduste komplekteerimine, indekseerimine ja skriptide käitamine tipptundidel) rakendamine aidata vältida selliseid probleeme nagu tabeli lukustamine ja jõudluse halvenemine. Töökoormust jagades ja päringuid optimeerides saate turvaliselt teha suuremahulisi muudatusi, põhjustamata seisakuid või tõrkeid, nagu "Veeru kehtetu nimi". 💻
Viited ja allikad
- Üksikasjalik teave tabelite muutmise ja andmete värskendamise protsessi kohta SQL Serveris. Lisateavet tabelite muutmise ja parimate tavade kohta vt Microsoft SQL Serveri dokumentatsioon .
- Annab ülevaate suurte tabelitega töötamise ja SQL-i käskude optimeerimise kohta, millele viidatakse SQL Shack .
- Selgitab kuupäevapõhiste tingimusvärskenduste ja indekseerimise tähtsust SQL-is, saadaval aadressil SQL Serveri keskus .