Kaip efektyviai pridėti stulpelį ir atnaujinti eilutes SQL serveryje

Temp mail SuperHeros
Kaip efektyviai pridėti stulpelį ir atnaujinti eilutes SQL serveryje
Kaip efektyviai pridėti stulpelį ir atnaujinti eilutes SQL serveryje

Lentelių modifikacijų įvaldymas SQL serveryje: nuoseklus vadovas

Kartais dirbant su dideliais duomenų rinkiniais gali atrodyti, kad vienu metu bandote žongliruoti šimtu užduočių. Neseniai atsidūriau situacijoje, kai į lentelę, kurioje yra daugiau nei milijonas eilučių, reikėjo pridėti stulpelį. Nors iš pirmo žvilgsnio tai atrodė paprasta užduotis, greitai susidūriau su kliūtimi, su kuria susiduria daugelis SQL serverio vartotojų: klaidą „Neteisingas stulpelio pavadinimas“. 🧐

Paleidęs keletą bandymų kartu vykdyti komandas ALTER TABLE ir UPDATE, supratau, kad problema kilo ne dėl logikos, o su mano užklausų seka. SQL serveris reikalauja, kad pirmiausia pridėtumėte stulpelį ir atliktumėte šį pakeitimą prieš atnaujindami jį bet kokiais duomenimis. Jei to nepadarysite, įvyksta klaida, nes sistema neatpažįsta naujai pridėto stulpelio tuo metu, kai vykdomas naujinimas.

Pavyzdžiui, įsivaizduokite, kad jums pavesta atnaujinti žymą „IS_CURRENT“, atsižvelgiant į konkrečią didelės klientų duomenų bazės datos slenkstį. Jei pridėsite stulpelį ir bandysite atnaujinti eilutes viename scenarijuje, SQL serveris gali pateikti klaidą „Neteisingas stulpelio pavadinimas“. Taip yra todėl, kad stulpelis nėra visiškai priskirtas prieš atnaujinimo užklausai bandant jį naudoti. 🚀

Šiame straipsnyje apžvelgsime tinkamą stulpelio pridėjimo ir eilučių atnaujinimo seką, kad būtų užtikrintas sklandus vykdymas net naudojant didelius duomenų rinkinius. Taip pat pasinersime į patarimus, kaip optimizuoti SQL scenarijus, kad būtų galima efektyviai apdoroti milijonus eilučių ir užtikrinti, kad duomenų operacijos vyktų be kliūčių. Sekite naujienas, kai tyrinėjame veiksmus ir šaliname įprastas problemas!

komandą Naudojimo pavyzdys
ALTER TABLE Ši komanda naudojama esamos lentelės struktūrai modifikuoti, pvz., pridėti naujų stulpelių. Pavyzdžiui, „ALTER TABLE dbo.sample ADD IS_CURRENT BIT;“ į lentelę „dbo.sample“ prideda naują stulpelį pavadinimu „IS_CURRENT“.
UPDATE Komanda „UPDATE“ naudojama esamiems lentelės įrašams modifikuoti. Pavyzdžiui, „ATNAUJINTI dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
CAST SQL serveryje „CAST“ naudojamas vieno tipo duomenų konvertavimui į kitą. Pavyzdyje `CAST(DATEADD(month, DATEDIFF(mėnuo, 0, DATAADD(DIENA, -60, GETDATE())), 0) AS DATE)' konvertuoja datos manipuliavimo rezultatą į datos tipą.
DATEADD Ši funkcija naudojama tam tikram laiko intervalui pridėti prie datos. Pavyzdžiui, „DATEADD(DAY, -60, GETDATE())“ iš dabartinės datos atima 60 dienų.
DATEDIFF Funkcija „DATEDIFF“ apskaičiuoja skirtumą tarp dviejų datų. Šiuo atveju „DATEDIFF(month, 0, GETDATE())“ suranda mėnesių skaičių nuo bazinės datos (0, kuri yra „1900-01-01“) ir dabartinės datos.
BEGIN TRANSACTION Ši komanda pradeda operacijų bloką. Tai būtina norint užtikrinti, kad keli SQL sakiniai būtų vykdomi kaip vienas vienetas, išlaikant duomenų vientisumą. „Pradėti TRANSACTION;“ pradeda operaciją, o bet kokie pakeitimai gali būti patvirtinti arba atšaukti.
COMMIT TRANSACTION Naudojamas visiems operacijos metu atliktiems pakeitimams įrašyti į duomenų bazę. 'COMMIT TRANSACTION;' užtikrina, kad visi pakeitimai, atlikti bloke 'PRADĖTI OPERACIJĄ', būtų užbaigti ir išliks.
UPDATE TOP Ši komandos „UPDATE“ versija naudojama naujinimo paveiktų eilučių skaičiui apriboti. Pavyzdžiui, „ATNAUJINTI VIRŠUS (10 000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
EXEC msdb.dbo.sp_add_job Ši išsaugota procedūra naudojama SQL Server Agent kuriant naują užduotį. `EXEC msdb.dbo.sp_add_job @job_name = 'Atnaujinti IS_CURRENT užduotį';` sukuria užduotį, kuri gali būti suplanuota automatiškai vykdyti tam tikras SQL komandas.

SQL serverio komandų, skirtų lentelių keitimui ir eilučių atnaujinimui, supratimas

Dirbant su SQL serveriu, ypač su lentelėmis, kuriose yra dideli duomenų rinkiniai, labai svarbu laikytis tvarkingo požiūrio keičiant lentelę ir atnaujinant jos eilutes. Vienas dažnas scenarijus – į lentelę reikia įtraukti naują stulpelį ir atnaujinti eilutes pagal konkrečias sąlygas, pvz., nustatyti vėliavėlę pagal datas. Mano pateiktame scenarijuje parodytas paprastas požiūris į tai, tačiau jame pabrėžiamos pagrindinės SQL serverio komandos, kurios yra būtinos norint efektyviai atlikti šias užduotis. The PAKEISTI LENTELĘ komanda naudojama norint į lentelę įtraukti naują stulpelį. Pavyzdžiui, kai vykdome 'ALTER TABLE dbo.sample ADD IS_CURRENT BIT;', modifikuojame lentelės struktūrą, kad pristatytume naują stulpelį, pavadintą 'IS_CURRENT', kurio tipas yra 'BIT' (loginis tipas, 0 arba 1).

Pridėjus stulpelį, kitas žingsnis yra atnaujinti lentelės eilutes pagal tam tikras sąlygas. Tai pasiekiama naudojant ATNAUJINTI komandą. Pavyzdžiui, užklausa „UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE

Kai kuriais atvejais, ypač dirbant su didelėmis lentelėmis, kuriose yra milijonai eilučių, svarbu užtikrinti, kad SQL komandos būtų vykdomos efektyviai. Čia veikia kaip DATAADD ir DATEDIFF ateiti į žaidimą. Šios funkcijos leidžia tiksliai manipuliuoti ir palyginti datas. Antroje naujinimo užklausoje „DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0)“ atima 60 dienų iš dabartinės datos („GETDATE()“) ir iš naujo nustato laiko iki mėnesio pradžios. Naudodami šias funkcijas galime apibrėžti dinamiškesnes dienų sekas, kurios koreguojasi laikui bėgant, užtikrinant, kad duomenys išliktų aktualūs net ir senstant.

Tačiau kai į vieną scenarijų sujungiami teiginiai „ALTER TABLE“ ir „UPDATE“, SQL serveris kartais gali pateikti klaidą „Neteisingas stulpelio pavadinimas“. Taip nutinka todėl, kad stulpelis, pridėtas naudojant „ALTER TABLE“, gali būti nevisiškai įtrauktas arba neatpažintas SQL serverio, vykdydamas paskesnes tos pačios partijos užklausas. Šios problemos sprendimas yra atskirti teiginį „ALTER TABLE“ ir „UPDATE“ komandas, užtikrinant, kad lentelės pakeitimas būtų visiškai atliktas prieš atliekant naujinimus. Tokiu būdu SQL Server naujas stulpelis bus tinkamai užregistruotas savo schemoje, todėl lentelę bus galima sklandžiai atnaujinti. Tvarkydami didelius duomenų rinkinius, apsvarstykite galimybę šias operacijas atlikti paketais arba naudoti operacijas, kad užtikrintumėte, jog procesas būtų kuo veiksmingesnis ir išvengtumėte galimo skirtojo laiko ar blokavimo. 🚀

1 sprendimas: standartinis lentelės keitimo ir eilučių atnaujinimo metodas

Šis sprendimas apima standartinį metodą, naudojant SQL Server Management Studio (SSMS), kai pirmiausia pridedame stulpelį, o tada atnaujiname eilutes atitinkamomis sąlygomis. Paleidžiame ALTER TABLE teiginį ir patvirtiname jį prieš atlikdami bet kokius atnaujinimus.

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

2 sprendimas: optimizuotas metodas, naudojant operaciją atomiškumo tikslais

Šis sprendimas užtikrina, kad lentelės modifikavimas ir eilučių atnaujinimai būtų atliekami atomiškai. Įtraukdami operacijas į sandorį, užtikriname nuoseklumą ir atšaukimą nesėkmės atveju.

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;

3 sprendimas: naudokite paketinį apdorojimą dideliems duomenų rinkiniams

Kai dirbate su lenteles, kuriose yra daugiau nei milijonas eilučių, labai svarbu sumažinti blokavimą ir sumažinti operacijos dydį. Šis sprendimas apdoroja naujinimus mažesnėmis partijomis, kad pagerintų našumą ir išvengtų skirtojo laiko.

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

4 sprendimas: Indeksuotų rodinių naudojimas našumui gerinti

Norėdami pagerinti našumą teikiant užklausas dėl didelių duomenų rinkinių, galite sukurti indeksuotus rodinius SQL serveryje. Šis metodas naudoja materializuotus vaizdus, ​​​​kad būtų saugomi sudėtingų užklausų rezultatai, sumažinant pasikartojančio duomenų apdorojimo poreikį.

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

5 sprendimas: susisiekite su SQL Server Agent Jobs dėl suplanuotų naujinimų

Jei reikia atnaujinti lentelę pagal planą, SQL Server Agent galima naudoti kuriant užduotis, kurios atlieka atnaujinimo procesą tam tikrais intervalais, išvengiant būtinybės vykdyti rankiniu būdu.

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';

Konkrečių SQL komandų, naudojamų scenarijuose, paaiškinimas

SQL serverio scenarijų optimizavimas didelėms lentelėms

Dirbant su didelėmis SQL serverio lentelėmis, keičiant lentelės struktūrą ir atnaujinant esamas eilutes svarbu atsižvelgti į našumo optimizavimo metodus. Viena iš dažniausiai pasitaikančių problemų, su kuriomis susiduriama paleidžiant scenarijus didelėse lentelėse, yra laikas, per kurį šios operacijos atliekamos, ypač kai lentelėje yra daugiau nei milijonas eilučių. Aptariamos operacijos, pvz., stulpelio pridėjimas su PAKEISTI LENTELĘ komandą ir eilučių atnaujinimas pagal konkrečias datos sąlygas gali užtrukti daug laiko. Šių operacijų optimizavimas tampa dar svarbesnis, kai dirbate su gamybos duomenų bazėmis, kuriose našumas yra prioritetas. Vienas scenarijus gali užrakinti lentelę ilgam laikui, paveikdamas kitas užklausas ir vartotojus.

Norint sušvelninti našumo problemas, vienas geriausių būdų yra suskaidyti užduotis į mažesnius žingsnius. Pavyzdžiui, užuot pridėję stulpelį ir atnaujinę visas eilutes viename scenarijuje, apsvarstykite galimybę paleisti PAKEISTI LENTELĘ komandą atskirai, po to sugrupuokite UPDATE operacijos. Atnaujinant įrašus mažesnėmis dalimis, scenarijus neapkraus serverio. Galite pasinaudoti UPDATE TOP komanda apriboti kiekvienos operacijos paveiktų eilučių skaičių. Be to, verta kurti indeksus jūsų stulpeliuose WHERE sąlygos (pvz LOAD_DATE), kad pagreitintumėte paieškos procesą. Didelių duomenų rinkinių indeksai sumažina eilučių filtravimo pagal dienų seką laiką.

Kitas svarbus aspektas yra operacijų naudojimas ir klaidų tvarkymas, siekiant užtikrinti, kad operacijos būtų vykdomos atomiškai. Suvynioję savo UPDATE pareiškimai viduje a BEGIN TRANSACTION ir COMMIT, užtikrinate, kad pakeitimai būtų atliekami saugiai ir nuosekliai. Jei kuri nors proceso dalis nepavyksta, galite naudoti ROLLBACK atšaukti pakeitimus, užkertant kelią daliniams atnaujinimams. Be to, scenarijų vykdymas ne piko valandomis arba naudojant SQL Server Agent planuojant šias operacijas užtikrina minimalų poveikį sistemos veikimui. Naudodami šiuos optimizavimus galite saugiai atlikti sudėtingus didelių lentelių pakeitimus, išlaikant sistemos vientisumą. 🖥️

Dažnai užduodami klausimai apie SQL serverio lentelės modifikacijas

  1. Kaip į SQL serverio lentelę įtraukti naują stulpelį?
  2. Galite pridėti naują stulpelį naudodami ALTER TABLE komandą. Pavyzdžiui: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; prideda stulpelį pavadinimu IS_CURRENT su duomenų tipu BIT.
  3. Kaip SQL Server galiu atnaujinti tik tam tikrą eilučių diapazoną?
  4. Naudokite UPDATE komandą su a WHERE sąlygą, skirtą eilėms filtruoti. Pavyzdžiui: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  5. Kodėl mano scenarijus pateikia klaidą „Neteisingas stulpelio pavadinimas“?
  6. Ši klaida atsiranda, jei ALTER TABLE komanda nėra visiškai įvykdyta prieš paleidžiant UPDATE pareiškimas. Norėdami to išvengti, paleiskite ALTER TABLE pirmiausia komandą, palaukite, kol bus pridėtas stulpelis, tada vykdykite UPDATE užklausas atskirai.
  7. Kaip galiu atnaujinti eilutes paketais, kad pagerinčiau našumą?
  8. Naudokite UPDATE TOP komanda apriboti vienu metu atnaujinamų eilučių skaičių. Pavyzdžiui: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  9. Ar galiu naudoti operaciją, kad užtikrinčiau atominius atnaujinimus?
  10. Taip! Apvyniokite savo UPDATE pareiškimai a BEGIN TRANSACTION ir COMMIT blokas, kad visi naujinimai būtų taikomi kaip vienas vienetas. Jei atsiranda kokių nors klaidų, naudokite ROLLBACK norėdami anuliuoti pakeitimus.
  11. Koks yra geriausias būdas optimizuoti didelių naujinimų našumą SQL Server?
  12. Apsvarstykite galimybę suskaidyti naujinimą į mažesnes dalis, atitinkamuose stulpeliuose sukurti indeksus ir paleisti scenarijų ne piko valandomis. Be to, naudojant UPDATE TOP metodas padeda išvengti blokavimo problemų ir sumažina išteklių suvartojimą.
  13. Kaip SQL serveryje datų palyginimus padaryti dinamiškesnius?
  14. Naudokite tokias datos funkcijas kaip DATEADD ir DATEDIFF atlikti dinaminius datos skaičiavimus. Pavyzdžiui, norėdami nustatyti datą prieš 60 dienų, naudokite DATEADD(DAY, -60, GETDATE()).
  15. Ką daryti, jei reikia atnaujinti milijonus eilučių pagal datą?
  16. Apsvarstykite galimybę naudoti indeksuotus stulpelius, kad pagerintumėte našumą. Be to, padalykite naujinimą į mažesnes operacijas ir naudokite UPDATE TOP atnaujinti eilutes paketais.
  17. Kaip išvengti blokavimo problemų atnaujinant didelę lentelę?
  18. Kad išvengtumėte užrakinimo problemų, pabandykite suskirstyti naujinimus į mažesnes partijas, naudokite operacijas, kad atliktumėte pakeitimus etapais, ir apsvarstykite galimybę paleisti naujinimą mažo naudojimo valandomis.
  19. Ar galiu suplanuoti didelius naujinimo scenarijus SQL serveryje?
  20. Taip, SQL Server Agent galima naudoti planuojant didelius naujinimo scenarijus ne piko valandomis, kad būtų sumažintas poveikis sistemos našumui. Sukurkite užduotį „SQL Server Agent“ ir nustatykite norimą tvarkaraštį.

Didelių lentelių modifikacijų optimizavimas SQL serveryje

Dirbant su SQL serveriu ir modifikuojant dideles lenteles, norint pagerinti našumą, labai svarbu suskaidyti operacijas. Pridėti stulpelį į lentelę su milijonais eilučių ir atnaujinti duomenis pagal konkrečias sąlygas gali būti sudėtinga. Tam reikia strateginio komandų vykdymo, pvz PAKEISTI LENTELĘ ir UPDATE užtikrinti, kad pakeitimai būtų taikomi neapkraunant sistemos.

Be to, diegdami geriausią praktiką, pvz., paketų naujinimus, indeksavimą ir scenarijų vykdymą ne piko valandomis, galite išvengti tokių problemų kaip lentelės užrakinimas ir našumo pablogėjimas. Padalinę darbo krūvį ir optimizuodami užklausas, galite saugiai atlikti didelio masto pakeitimus, nesukeldami prastovos ar klaidų, pvz., „Neteisingas stulpelio pavadinimas“. 💻

Nuorodos ir šaltiniai
  1. Išsamiai aprašomas lentelių keitimo ir duomenų atnaujinimo procesas SQL serveryje. Daugiau apie lentelių keitimą ir geriausią praktiką žr Microsoft SQL serverio dokumentacija .
  2. Suteikia įžvalgų, kaip dirbti su didelėmis lentelėmis ir optimizuoti SQL komandas SQL Shack .
  3. Paaiškina data pagrįstų sąlyginių naujinimų ir indeksavimo svarbą SQL, pasiekiama adresu SQL serverio centras .