$lang['tuto'] = "Туторијали"; ?> Како ефикасно додати колону и

Како ефикасно додати колону и ажурирати редове у СКЛ Серверу

Temp mail SuperHeros
Како ефикасно додати колону и ажурирати редове у СКЛ Серверу
Како ефикасно додати колону и ажурирати редове у СКЛ Серверу

Овладавање модификацијама табела у СКЛ Серверу: Водич корак по корак

Понекад рад са великим скуповима података може изгледати као да покушавате да жонглирате са стотину задатака одједном. Недавно сам се нашао у ситуацији да морам да додам колону у табелу која садржи преко милион редова. Иако је ово изгледало као једноставан задатак на површини, брзо сам наишао на препреку са којом се суочавају многи корисници СКЛ Сервера: страшну грешку „Неважећи назив колоне“. 🧐

Након неколико покушаја да заједно извршим команде АЛТЕР ТАБЛЕ и УПДАТЕ, схватио сам да проблем није у логици већ у редоследу мојих упита. СКЛ Сервер захтева да прво додате колону и извршите ту промену пре него што је ажурирате било којим подацима. Ако то не урадите, долази до грешке јер систем не препознаје новододату колону у тренутку када се ажурирање изврши.

На пример, замислите да имате задатак да ажурирате ознаку „ИС_ЦУРРЕНТ“ на основу одређеног прага датума за велику базу података клијената. Ако додате колону и покушате да ажурирате редове у једној скрипти, СКЛ Сервер може да избаци грешку „Неважеће име колоне“. То је зато што колона није у потпуности урезана пре него што упит за ажурирање покуша да је користи. 🚀

У овом чланку ћемо проћи кроз одговарајући редослед да бисмо додали колону и ажурирали редове, обезбеђујући несметано извршавање чак и са великим скуповима података. Такође ћемо заронити у савете за оптимизацију СКЛ скрипти за ефикасно руковање милионима редова, обезбеђујући да се ваше операције са подацима одвијају без проблема. Пратите нас док истражујемо кораке и решавамо уобичајене проблеме на путу!

Цомманд Пример употребе
ALTER TABLE Ова команда се користи за измену структуре постојеће табеле, као што је додавање нових колона. На пример, `АЛТЕР ТАБЛЕ дбо.сампле АДД ИС_ЦУРРЕНТ БИТ;` додаје нову колону под називом `ИС_ЦУРРЕНТ` у табелу `дбо.сампле`.
UPDATE Команда `УПДАТЕ` се користи за измену постојећих записа у табели. На пример, `УПДАТЕ дбо.сампле СЕТ ИС_ЦУРРЕНТ = 0 ВХЕРЕ ЛОАД_ДАТЕ
CAST У СКЛ Серверу, `ЦАСТ` се користи за претварање једног типа података у други. У примеру, `ЦАСТ(ДАТЕАДД(монтх, ДАТЕДИФФ(монтх, 0, ДАТЕАДД(ДАИ, -60, ГЕТДАТЕ())), 0) АС ДАТЕ)` конвертује резултат манипулације датумом у тип датума.
DATEADD Ова функција се користи за додавање одређеног временског интервала датуму. На пример, `ДАТЕАДД(ДАИ, -60, ГЕТДАТЕ())` одузима 60 дана од тренутног датума.
DATEDIFF Функција `ДАТЕДИФФ` израчунава разлику између два датума. У овом случају, `ДАТЕДИФФ(монтх, 0, ГЕТДАТЕ())` проналази број месеци између основног датума (0, што је '1900-01-01') и тренутног датума.
BEGIN TRANSACTION Ова команда покреће блок трансакције. Неопходно је да се обезбеди да се више СКЛ наредби извршава као једна јединица, одржавајући интегритет података. `БЕГИН ТРАНСАЦТИОН;` започиње трансакцију, а све промене могу бити урезане или поништене.
COMMIT TRANSACTION Користи се за чување свих промена направљених током трансакције у бази података. `ЦОММИТ ТРАНСАЦТИОН;` осигурава да су све промене направљене унутар блока `ПОЧНИ ТРАНСАКЦИЈА` финализоване и постојане.
UPDATE TOP Ова верзија наредбе `УПДАТЕ` се користи за ограничавање броја редова на које ажурирање утиче. На пример, `УПДАТЕ ТОП (10000) дбо.сампле СЕТ ИС_ЦУРРЕНТ = 0 ВХЕРЕ ЛОАД_ДАТЕ
EXEC msdb.dbo.sp_add_job Ова ускладиштена процедура се користи у СКЛ Сервер Агенту за креирање новог посла. `ЕКСЕЦ мсдб.дбо.сп_адд_јоб @јоб_наме = 'Ажурирај ИС_ЦУРРЕНТ посао';` креира посао који се може заказати за аутоматско покретање одређених СКЛ команди.

Разумевање СКЛ Сервер команди за мењање табела и ажурирање редова

Када радите са СКЛ Сервером, посебно са табелама које садрже велике скупове података, кључно је пратити уредан приступ изменама табеле и ажурирању њених редова. Један уобичајени сценарио је да треба додати нову колону у табелу, а затим ажурирати редове на основу специфичних услова, као што је постављање заставице на основу датума. Скрипта коју сам дао демонстрира једноставан приступ овоме, али истиче кључне СКЛ Сервер команде које су неопходне за ефикасно постизање ових задатака. Тхе АЛТЕР ТАБЛЕ команда се користи за додавање нове колоне у табелу. На пример, када покренемо `АЛТЕР ТАБЛЕ дбо.сампле АДД ИС_ЦУРРЕНТ БИТ;`, мењамо структуру табеле да бисмо увели нову колону под називом `ИС_ЦУРРЕНТ` типа `БИТ` (боолеан тип, 0 или 1).

Након додавања колоне, следећи корак је ажурирање редова у табели на основу одређених услова. Ово се постиже коришћењем УПДАТЕ команда. На пример, упит `УПДАТЕ дбо.сампле СЕТ ИС_ЦУРРЕНТ = 0 ВХЕРЕ ЛОАД_ДАТЕ

У неким случајевима, посебно када се ради о великим табелама које садрже милионе редова, важно је осигурати да се СКЛ команде извршавају ефикасно. Овде функционише као ДАТЕАДД и ДАТЕДИФФ ући у игру. Ове функције вам омогућавају да прецизно манипулишете и упоређујете датуме. У другом упиту за ажурирање, `ДАТЕАДД(монтх, ДАТЕДИФФ(монтх, 0, ДАТЕАДД(ДАИ, -60, ГЕТДАТЕ())), 0) одузима 60 дана од тренутног датума (`ГЕТДАТЕ()`) и ресетује време до почетка месеца. Коришћењем ових функција можемо да дефинишемо динамичније опсеге датума који се прилагођавају како време напредује, обезбеђујући да подаци остану актуелни чак и како стари.

Међутим, када комбинује и `АЛТЕР ТАБЛЕ` и `УПДАТЕ` у једну скрипту, СКЛ Сервер понекад може да избаци грешку „Неважеће име колоне“. Ово се дешава зато што колона коју додаје `АЛТЕР ТАБЛЕ` можда неће бити у потпуности урезана или препозната од стране СКЛ Сервера током извршавања наредних упита у истој групи. Решење овог проблема је одвајање наредбе `АЛТЕР ТАБЛЕ` и команди `УПДАТЕ`, обезбеђујући да је измена табеле у потпуности урезана пре извођења ажурирања. На тај начин, СКЛ Сервер ће имати нову колону исправно регистровану у својој шеми, омогућавајући неометано ажурирање табеле. Када рукујете великим скуповима података, размислите о извршавању ових операција у групама или о коришћењу трансакција како бисте осигурали да је процес што ефикаснији, избегавајући потенцијална временска ограничења или закључавања. 🚀

Решење 1: Стандардни приступ за измену табеле и ажурирање редова

Ово решење подразумева стандардни приступ користећи СКЛ Сервер Манагемент Студио (ССМС), где прво додајемо колону, а затим ажурирамо редове одговарајућим условима. Покрећемо наредбу АЛТЕР ТАБЛЕ и урезујемо је пре него што извршимо ажурирање.

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: Оптимизовани приступ који користи трансакцију за атомичност

Ово решење обезбеђује да се измена табеле и ажурирање редова изврши атомски. Умотавањем операција у трансакцију, обезбеђујемо доследност и враћање уназад у случају неуспеха.

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: Приступ коришћењем групне обраде за велике скупове података

Када имате посла са табелама које садрже преко милион редова, неопходно је минимизирати закључавање и смањити величину трансакције. Ово решење обрађује ажурирања у мањим серијама како би побољшала перформансе и спречила временско ограничење.

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: Коришћење индексираних приказа за побољшање перформанси

За побољшање перформанси при постављању упита великим скуповима података, можете креирати индексиране приказе у СКЛ Серверу. Овај приступ користи материјализоване погледе за складиштење резултата сложених упита, смањујући потребу за понављајућом обрадом података.

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: Приступите пословима агента СКЛ Сервера за планирана ажурирања

Ако треба да ажурирате табелу по распореду, СКЛ Сервер Агент се може користити за креирање послова који извршавају процес ажурирања у одређеним интервалима, избегавајући потребу за ручним извршавањем.

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

Објашњење специфичних СКЛ команди које се користе у скриптама

Оптимизација СКЛ Сервер скрипти за велике табеле

Када радите са великим табелама у СКЛ Серверу, важно је узети у обзир технике оптимизације перформанси када мењате структуру табеле и ажурирате постојеће редове. Један од најчешћих проблема са којима се сусрећу при покретању скрипти на великим табелама је време које је потребно да се ове операције доврше, посебно када табела садржи преко милион редова. Операције у питању, као што је додавање колоне са АЛТЕР ТАБЛЕ команде и ажурирање редова на основу специфичних датумских услова, може потрајати значајно време. Оптимизација ових операција постаје још важнија када радите на производним базама података где су перформансе приоритет. Једна скрипта потенцијално може закључати табелу на дужи период, утичући на друге упите и кориснике.

Да бисте ублажили проблеме са перформансама, један од најбољих приступа је разбијање задатака на мање кораке. На пример, уместо да додајете колону и ажурирате све редове у једној скрипти, размислите о покретању АЛТЕР ТАБЛЕ команду одвојено, након чега следи батцхинг тхе UPDATE операције. Ажурирањем записа у мањим деловима, скрипта неће преоптеретити сервер. Можете искористити UPDATE TOP команду за ограничавање броја редова на које утиче свака трансакција. Поред тога, такође је добра идеја да креирате индексе на колонама које се користе у вашем WHERE клаузуле (као нпр LOAD_DATE) да бисте убрзали процес претраживања. За велике скупове података, индекси смањују време потребно за филтрирање редова на основу периода.

Још једно важно питање је употреба трансакција и руковања грешкама како би се осигурало да се операције извршавају атомски. Умотавањем свог UPDATE изјаве унутар а BEGIN TRANSACTION и COMMIT, обезбеђујете да се промене врше на безбедан и доследан начин. Ако било који део процеса не успе, можете га користити ROLLBACK да вратите промене, спречавајући делимична ажурирања. Поред тога, покретање скрипти током радних сати или коришћење СКЛ Сервер агента за планирање ових операција обезбеђује минималан утицај на перформансе система. Са овим оптимизацијама, можете безбедно да извршите сложене модификације на великим табелама уз одржавање интегритета система. 🖥

Често постављана питања о модификацијама табела СКЛ Сервера

  1. Како да додам нову колону у табелу у СКЛ Серверу?
  2. Можете додати нову колону користећи ALTER TABLE команда. На пример: АЛТЕР ТАБЛЕ дбо.сампле АДД ИС_ЦУРРЕНТ БИТ; додаје колону под називом ИС_ЦУРРЕНТ са типом података БИТ.
  3. Како могу да ажурирам само одређени опсег редова у СКЛ Серверу?
  4. Користите UPDATE команда са а WHERE клаузула за филтрирање редова. На пример: УПДАТЕ дбо.сампле СЕТ ИС_ЦУРРЕНТ = 0 ВХЕРЕ ЛОАД_ДАТЕ
  5. Зашто моја скрипта приказује грешку „Неважећи назив колоне“?
  6. Ова грешка се јавља ако ALTER TABLE команда није у потпуности предана пре покретања UPDATE изјава. Да бисте то избегли, покрените ALTER TABLE прво наредбу, сачекајте да се колона дода, а затим извршите UPDATE упити одвојено.
  7. Како могу да ажурирам редове у групама да бих побољшао перформансе?
  8. Користите UPDATE TOP команду за ограничавање броја редова који се ажурирају одједном. На пример: УПДАТЕ ТОП (1000) дбо.сампле СЕТ ИС_ЦУРРЕНТ = 0 ВХЕРЕ ЛОАД_ДАТЕ
  9. Могу ли да користим трансакцију да обезбедим атомска ажурирања?
  10. Да! Замотајте своје UPDATE изјаве у а BEGIN TRANSACTION и COMMIT блок како би се осигурало да се сва ажурирања примењују као једна целина. Ако дође до грешке, користите ROLLBACK да поништите промене.
  11. Који је најбољи начин за оптимизацију перформанси великих ажурирања у СКЛ Серверу?
  12. Размислите о разбијању ажурирања на мање делове, креирању индекса на релевантним колонама и покретању скрипте током сати ван шпица. Поред тога, коришћењем UPDATE TOP метода помаже да се избегну проблеми са закључавањем и смањује потрошња ресурса.
  13. Како могу учинити поређења датума динамичнијим у СКЛ Серверу?
  14. Користите функције датума као што су DATEADD и DATEDIFF за обављање динамичких израчунавања датума. На пример, да бисте подесили датум пре 60 дана, користите ДАТЕАДД(ДАИ, -60, ГЕТДАТЕ()).
  15. Шта да радим ако треба да ажурирам милионе редова на основу датума?
  16. Размислите о коришћењу индексираних колона за бољи учинак. Поред тога, поделите ажурирање на мање трансакције и користите UPDATE TOP да ажурирате редове у серијама.
  17. Како могу да избегнем проблеме са закључавањем приликом ажурирања велике табеле?
  18. Да бисте спречили проблеме са закључавањем, покушајте да поделите ажурирања у мање групе, користите трансакције да бисте унели промене у фазама и размислите о покретању ажурирања током сати мале употребе.
  19. Могу ли да закажем велике скрипте ажурирања у СКЛ Серверу?
  20. Да, СКЛ Сервер Агент се може користити за планирање великих скрипти ажурирања током сати ван шпица да би се смањио утицај на перформансе система. Креирајте посао у СКЛ Сервер Агенту и поставите жељени распоред.

Оптимизација великих измена табеле у СКЛ Серверу

Када радите са СКЛ Сервером на модификовању великих табела, разбијање ваших операција је кључно за побољшање перформанси. Додавање колоне у табелу са милионима редова и ажурирање података на основу специфичних услова може бити изазов. Ово захтева стратешко извршавање команди попут АЛТЕР ТАБЛЕ и UPDATE како би се осигурало да се промене примењују без преоптерећења система.

Поред тога, примена најбољих пракси као што су пакетно ажурирање, коришћење индексирања и покретање скрипти током сати ван шпица може помоћи у спречавању проблема као што су закључавање табеле и деградација перформанси. Поделом радног оптерећења и оптимизацијом упита, можете безбедно да правите велике промене без изазивања застоја или грешака као што је „Неважећи назив колоне“. 💻

Референце и извори
  1. Детаљно описује процес измене табела и ажурирања података у СКЛ Серверу. Више о мењању табела и најбољим праксама потражите у Мицрософт СКЛ Сервер документација .
  2. Пружа увид у рад са великим табелама и оптимизацију СКЛ команди, на које се позива СКЛ Схацк .
  3. Објашњава важност условних ажурирања заснованих на датуму и индексирања у СКЛ-у, доступно на СКЛ Сервер Централ .