SQL സെർവറിലെ മാസ്റ്ററിംഗ് ടേബിൾ പരിഷ്ക്കരണങ്ങൾ: ഒരു ഘട്ടം ഘട്ടമായുള്ള ഗൈഡ്
ചിലപ്പോൾ, വലിയ ഡാറ്റാസെറ്റുകളിൽ പ്രവർത്തിക്കുന്നത് ഒരേസമയം നൂറ് ടാസ്ക്കുകൾ കൈകാര്യം ചെയ്യാൻ ശ്രമിക്കുന്നതായി തോന്നാം. അടുത്തിടെ, ഒരു ദശലക്ഷത്തിലധികം വരികൾ അടങ്ങിയ ഒരു പട്ടികയിലേക്ക് ഒരു കോളം ചേർക്കേണ്ട ഒരു സാഹചര്യത്തിൽ ഞാൻ എന്നെത്തന്നെ കണ്ടെത്തി. ഉപരിതലത്തിൽ ഇതൊരു ലളിതമായ ജോലിയായി തോന്നുമെങ്കിലും, നിരവധി SQL സെർവർ ഉപയോക്താക്കൾ അഭിമുഖീകരിക്കുന്ന ഒരു റോഡ്ബ്ലോക്കിലേക്ക് ഞാൻ പെട്ടെന്ന് ഓടിയെത്തി: ഭയാനകമായ "അസാധുവായ കോളത്തിൻ്റെ പേര്" പിശക്. 🧐
എൻ്റെ ആൾട്ടർ ടേബിളും അപ്ഡേറ്റ് കമാൻഡും ഒരുമിച്ച് എക്സിക്യൂട്ട് ചെയ്യാനുള്ള നിരവധി ശ്രമങ്ങൾ നടത്തിയ ശേഷം, പ്രശ്നം യുക്തിയിലല്ല, എൻ്റെ അന്വേഷണങ്ങളുടെ ക്രമത്തിലാണെന്ന് ഞാൻ മനസ്സിലാക്കി. SQL സെർവറിന് നിങ്ങൾ ആദ്യം കോളം ചേർക്കുകയും ഏതെങ്കിലും ഡാറ്റ ഉപയോഗിച്ച് അത് അപ്ഡേറ്റ് ചെയ്യുന്നതിന് മുമ്പ് ആ മാറ്റം വരുത്തുകയും വേണം. അങ്ങനെ ചെയ്യുന്നതിൽ പരാജയപ്പെടുന്നത് ഒരു പിശകിന് കാരണമാകുന്നു, കാരണം അപ്ഡേറ്റ് എക്സിക്യൂട്ട് ചെയ്യുന്ന സമയത്ത് പുതിയതായി ചേർത്ത കോളം സിസ്റ്റം തിരിച്ചറിയുന്നില്ല.
ഉദാഹരണത്തിന്, ഒരു വലിയ ഉപഭോക്തൃ ഡാറ്റാബേസിനായി ഒരു നിർദ്ദിഷ്ട തീയതി പരിധി അടിസ്ഥാനമാക്കി "IS_CURRENT" ഫ്ലാഗ് അപ്ഡേറ്റ് ചെയ്യാൻ നിങ്ങളെ ചുമതലപ്പെടുത്തിയതായി സങ്കൽപ്പിക്കുക. നിങ്ങൾ കോളം ചേർത്ത് ഒറ്റ സ്ക്രിപ്റ്റിൽ വരികൾ അപ്ഡേറ്റ് ചെയ്യാൻ ശ്രമിക്കുകയാണെങ്കിൽ, SQL സെർവർ "അസാധുവായ കോളത്തിൻ്റെ പേര്" പിശക് വരുത്തിയേക്കാം. അപ്ഡേറ്റ് ചോദ്യം ഉപയോഗിക്കുന്നതിന് മുമ്പ് കോളം പൂർണ്ണമായും പ്രതിജ്ഞാബദ്ധമല്ല എന്നതാണ് ഇതിന് കാരണം. 🚀
ഈ ലേഖനത്തിൽ, കോളം ചേർക്കുന്നതിനും വരികൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുള്ള ശരിയായ ക്രമത്തിലൂടെ ഞങ്ങൾ സഞ്ചരിക്കും, വലിയ ഡാറ്റാസെറ്റുകളിൽ പോലും സുഗമമായ നിർവ്വഹണം ഉറപ്പാക്കുന്നു. ദശലക്ഷക്കണക്കിന് വരികൾ കാര്യക്ഷമമായി കൈകാര്യം ചെയ്യുന്നതിനായി SQL സ്ക്രിപ്റ്റുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിനുള്ള നുറുങ്ങുകളിലേക്കും ഞങ്ങൾ മുഴുകും, നിങ്ങളുടെ ഡാറ്റാ പ്രവർത്തനങ്ങൾ തടസ്സമില്ലാതെ പ്രവർത്തിക്കുന്നുവെന്ന് ഉറപ്പാക്കും. ഞങ്ങൾ ഘട്ടങ്ങൾ പര്യവേക്ഷണം ചെയ്യുകയും വഴിയിലെ പൊതുവായ പ്രശ്നങ്ങൾ പരിഹരിക്കുകയും ചെയ്യുമ്പോൾ തുടരുക!
കമാൻഡ് | ഉപയോഗത്തിൻ്റെ ഉദാഹരണം |
---|---|
ALTER TABLE | പുതിയ നിരകൾ ചേർക്കുന്നത് പോലെ നിലവിലുള്ള ഒരു പട്ടികയുടെ ഘടന പരിഷ്കരിക്കുന്നതിന് ഈ കമാൻഡ് ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;` `dbo.sample` പട്ടികയിലേക്ക് `IS_CURRENT` എന്ന പുതിയ കോളം ചേർക്കുന്നു. |
UPDATE | ഒരു പട്ടികയിൽ നിലവിലുള്ള റെക്കോർഡുകൾ പരിഷ്ക്കരിക്കുന്നതിന് `UPDATE` കമാൻഡ് ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
CAST | SQL സെർവറിൽ, ഒരു ഡാറ്റ തരം മറ്റൊന്നിലേക്ക് പരിവർത്തനം ചെയ്യാൻ `CAST` ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിൽ, `CAST(DATEADD(മാസം, DATEDIFF(മാസം, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE)` എന്നത് ഒരു തീയതി കൃത്രിമത്വ ഫലത്തെ ഒരു തീയതി തരത്തിലേക്ക് പരിവർത്തനം ചെയ്യുന്നു. |
DATEADD | ഒരു തീയതിയിലേക്ക് ഒരു നിശ്ചിത സമയ ഇടവേള ചേർക്കാൻ ഈ ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, `DATEADD(DAY, -60, GETDATE())` നിലവിലെ തീയതിയിൽ നിന്ന് 60 ദിവസം കുറയ്ക്കുന്നു. |
DATEDIFF | `DATEDIFF` ഫംഗ്ഷൻ രണ്ട് തീയതികൾ തമ്മിലുള്ള വ്യത്യാസം കണക്കാക്കുന്നു. ഈ സാഹചര്യത്തിൽ, `DATEDIFF(മാസം, 0, GETDATE())` അടിസ്ഥാന തീയതിക്കും (0, അത് '1900-01-01') നിലവിലെ തീയതിക്കും ഇടയിലുള്ള മാസങ്ങളുടെ എണ്ണം കണ്ടെത്തുന്നു. |
BEGIN TRANSACTION | ഈ കമാൻഡ് ഒരു ഇടപാട് ബ്ലോക്ക് ആരംഭിക്കുന്നു. ഡാറ്റ സമഗ്രത നിലനിർത്തിക്കൊണ്ട് ഒന്നിലധികം SQL പ്രസ്താവനകൾ ഒരൊറ്റ യൂണിറ്റായി എക്സിക്യൂട്ട് ചെയ്യുന്നുണ്ടെന്ന് ഉറപ്പാക്കേണ്ടത് അത്യാവശ്യമാണ്. `ആരംഭ ഇടപാട്;` ഇടപാട് ആരംഭിക്കുന്നു, എന്തെങ്കിലും മാറ്റങ്ങൾ വരുത്തുകയോ പിൻവലിക്കുകയോ ചെയ്യാം. |
COMMIT TRANSACTION | ഇടപാട് സമയത്ത് വരുത്തിയ എല്ലാ മാറ്റങ്ങളും ഡാറ്റാബേസിൽ സംരക്ഷിക്കാൻ ഉപയോഗിക്കുന്നു. `കമ്മിറ്റ് ട്രാൻസാക്ഷൻ;` `ആദ്യ ഇടപാട്` ബ്ലോക്കിനുള്ളിൽ വരുത്തിയ എല്ലാ മാറ്റങ്ങളും അന്തിമമാക്കുകയും നിലനിൽക്കുകയും ചെയ്യുന്നുവെന്ന് ഉറപ്പാക്കുന്നു. |
UPDATE TOP | അപ്ഡേറ്റ് ബാധിച്ച വരികളുടെ എണ്ണം പരിമിതപ്പെടുത്തുന്നതിന് `UPDATE` കമാൻഡിൻ്റെ ഈ പതിപ്പ് ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, `UPDATE TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE |
EXEC msdb.dbo.sp_add_job | ഒരു പുതിയ ജോലി സൃഷ്ടിക്കാൻ ഈ സംഭരിച്ച നടപടിക്രമം SQL സെർവർ ഏജൻ്റിൽ ഉപയോഗിക്കുന്നു. `EXEC msdb.dbo.sp_add_job @job_name = 'IS_CURRENT ജോലി അപ്ഡേറ്റ് ചെയ്യുക';` നിർദ്ദിഷ്ട SQL കമാൻഡുകൾ സ്വയമേവ പ്രവർത്തിപ്പിക്കുന്നതിന് ഷെഡ്യൂൾ ചെയ്യാവുന്ന ഒരു ജോലി സൃഷ്ടിക്കുന്നു. |
പട്ടികകൾ മാറ്റുന്നതിനും വരികൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുള്ള SQL സെർവർ കമാൻഡുകൾ മനസ്സിലാക്കുന്നു
SQL സെർവറുമായി പ്രവർത്തിക്കുമ്പോൾ, പ്രത്യേകിച്ച് വലിയ ഡാറ്റാസെറ്റുകൾ അടങ്ങിയ പട്ടികകളിൽ, ഒരു പട്ടിക മാറ്റുന്നതിനും അതിൻ്റെ വരികൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുള്ള ഒരു ചിട്ടയായ സമീപനം പിന്തുടരുന്നത് നിർണായകമാണ്. ഒരു പൊതു സാഹചര്യത്തിന്, ഒരു പട്ടികയിലേക്ക് ഒരു പുതിയ കോളം ചേർക്കേണ്ടതുണ്ട്, തുടർന്ന് തീയതികളെ അടിസ്ഥാനമാക്കി ഒരു ഫ്ലാഗ് സജ്ജീകരിക്കുന്നത് പോലെയുള്ള നിർദ്ദിഷ്ട വ്യവസ്ഥകളെ അടിസ്ഥാനമാക്കി വരികൾ അപ്ഡേറ്റ് ചെയ്യേണ്ടത് ആവശ്യമാണ്. ഞാൻ നൽകിയ സ്ക്രിപ്റ്റ് ഇതിനുള്ള ഒരു ലളിതമായ സമീപനം പ്രകടമാക്കുന്നു, എന്നാൽ ഈ ടാസ്ക്കുകൾ കാര്യക്ഷമമായി നേടുന്നതിന് അത്യന്താപേക്ഷിതമായ പ്രധാന SQL സെർവർ കമാൻഡുകൾ ഇത് ഹൈലൈറ്റ് ചെയ്യുന്നു. ദി ആൾട്ടർ ടേബിൾ പട്ടികയിൽ ഒരു പുതിയ കോളം ചേർക്കാൻ കമാൻഡ് ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, ഞങ്ങൾ `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;` റൺ ചെയ്യുമ്പോൾ, `BIT` (ഒരു ബൂളിയൻ തരം, ഒന്നുകിൽ 0 അല്ലെങ്കിൽ 1) `IS_CURRENT` എന്ന പേരിൽ ഒരു പുതിയ കോളം അവതരിപ്പിക്കുന്നതിനായി ഞങ്ങൾ പട്ടികയുടെ ഘടന പരിഷ്ക്കരിക്കുന്നു.
കോളം ചേർത്ത ശേഷം, അടുത്ത ഘട്ടം ചില വ്യവസ്ഥകളെ അടിസ്ഥാനമാക്കി പട്ടികയിലെ വരികൾ അപ്ഡേറ്റ് ചെയ്യുക എന്നതാണ്. ഉപയോഗിച്ച് ഇത് നേടിയെടുക്കുന്നു അപ്ഡേറ്റ് ചെയ്യുക കമാൻഡ്. ഉദാഹരണത്തിന്, ചോദ്യം `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
ചില സന്ദർഭങ്ങളിൽ, പ്രത്യേകിച്ച് ദശലക്ഷക്കണക്കിന് വരികൾ അടങ്ങിയ വലിയ ടേബിളുകൾ കൈകാര്യം ചെയ്യുമ്പോൾ, SQL കമാൻഡുകൾ കാര്യക്ഷമമായി നടപ്പിലാക്കുന്നുവെന്ന് ഉറപ്പാക്കേണ്ടത് പ്രധാനമാണ്. ഇവിടെയാണ് പ്രവർത്തനങ്ങൾ പോലെയുള്ളത് DATEADD ഒപ്പം DATEDIFF കളിക്കുക. തീയതികൾ കൃത്യതയോടെ കൈകാര്യം ചെയ്യാനും താരതമ്യം ചെയ്യാനും ഈ പ്രവർത്തനങ്ങൾ നിങ്ങളെ അനുവദിക്കുന്നു. രണ്ടാമത്തെ അപ്ഡേറ്റ് ചോദ്യത്തിൽ, `DATEADD(മാസം, DATEDIFF(മാസം, 0, DATEADD(DAY, -60, GETDATE())), 0)` നിലവിലെ തീയതിയിൽ നിന്ന് (`GETDATE()`) 60 ദിവസം കുറയ്ക്കുകയും പുനഃസജ്ജമാക്കുകയും ചെയ്യുന്നു മാസത്തിൻ്റെ ആരംഭം വരെയുള്ള സമയം. ഈ ഫംഗ്ഷനുകൾ ഉപയോഗിക്കുന്നതിലൂടെ, സമയം പുരോഗമിക്കുമ്പോൾ ക്രമീകരിക്കുന്ന കൂടുതൽ ഡൈനാമിക് തീയതി ശ്രേണികൾ നമുക്ക് നിർവചിക്കാൻ കഴിയും, ഡാറ്റ പ്രായമാകുമ്പോഴും നിലവിലുള്ളതായി തുടരുന്നുവെന്ന് ഉറപ്പാക്കുന്നു.
എന്നിരുന്നാലും, `ALTER TABLE`, `UPDATE` എന്നീ രണ്ട് പ്രസ്താവനകളും ഒരൊറ്റ സ്ക്രിപ്റ്റിലേക്ക് സംയോജിപ്പിക്കുമ്പോൾ, SQL സെർവറിന് ചിലപ്പോൾ "അസാധുവായ നിരയുടെ പേര്" പിശക് ഇടാം. ഇതേ ബാച്ചിലെ തുടർന്നുള്ള അന്വേഷണങ്ങൾ നിർവ്വഹിക്കുമ്പോൾ `ALTER TABLE` ചേർത്ത കോളം SQL സെർവർ പൂർണ്ണമായി പ്രതിജ്ഞാബദ്ധമായിരിക്കുകയോ തിരിച്ചറിയുകയോ ചെയ്തേക്കില്ല എന്നതിനാലാണ് ഇത് സംഭവിക്കുന്നത്. ഈ പ്രശ്നത്തിനുള്ള പരിഹാരം, അപ്ഡേറ്റുകൾ നടത്തുന്നതിന് മുമ്പായി പട്ടികയിൽ മാറ്റം വരുത്തുന്നത് പൂർണ്ണമായും പ്രതിജ്ഞാബദ്ധമാണെന്ന് ഉറപ്പാക്കിക്കൊണ്ട് `ALTER TABLE` പ്രസ്താവനയും `UPDATE` കമാൻഡുകളും വേർതിരിക്കുക എന്നതാണ്. അങ്ങനെ ചെയ്യുന്നതിലൂടെ, SQL സെർവറിന് പുതിയ കോളം അതിൻ്റെ സ്കീമയിൽ ശരിയായി രജിസ്റ്റർ ചെയ്യപ്പെടും, ഇത് പട്ടികയിലേക്ക് സുഗമമായ അപ്ഡേറ്റുകൾ അനുവദിക്കുന്നു. വലിയ ഡാറ്റാസെറ്റുകൾ കൈകാര്യം ചെയ്യുമ്പോൾ, ഈ പ്രവർത്തനങ്ങൾ ബാച്ചുകളായി നിർവ്വഹിക്കുന്നതോ ഇടപാടുകൾ ഉപയോഗിച്ച് പ്രക്രിയ കഴിയുന്നത്ര കാര്യക്ഷമമാണെന്ന് ഉറപ്പാക്കാൻ, സാധ്യതയുള്ള സമയപരിധികളോ ലോക്കുകളോ ഒഴിവാക്കുന്നത് പരിഗണിക്കുക. 🚀
പരിഹാരം 1: പട്ടിക മാറ്റുന്നതിനും വരികൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുള്ള സ്റ്റാൻഡേർഡ് സമീപനം
ഈ പരിഹാരത്തിൽ SQL സെർവർ മാനേജ്മെൻ്റ് സ്റ്റുഡിയോ (SSMS) ഉപയോഗിക്കുന്ന സ്റ്റാൻഡേർഡ് സമീപനം ഉൾപ്പെടുന്നു, അവിടെ ഞങ്ങൾ ആദ്യം കോളം ചേർക്കുകയും തുടർന്ന് ഉചിതമായ വ്യവസ്ഥകളോടെ വരികൾ അപ്ഡേറ്റ് ചെയ്യുകയും ചെയ്യുന്നു. ഞങ്ങൾ ALTER TABLE സ്റ്റേറ്റ്മെൻ്റ് പ്രവർത്തിപ്പിക്കുകയും എന്തെങ്കിലും അപ്ഡേറ്റുകൾ നടത്തുന്നതിന് മുമ്പ് അത് സമർപ്പിക്കുകയും ചെയ്യുന്നു.
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: പ്രകടന മെച്ചപ്പെടുത്തലിനായി ഇൻഡക്സ് ചെയ്ത കാഴ്ചകളുടെ ഉപയോഗം
വലിയ ഡാറ്റാസെറ്റുകൾ അന്വേഷിക്കുമ്പോൾ പ്രകടനം മെച്ചപ്പെടുത്തുന്നതിന്, നിങ്ങൾക്ക് SQL സെർവറിൽ ഇൻഡക്സ് ചെയ്ത കാഴ്ചകൾ സൃഷ്ടിക്കാനാകും. ഈ സമീപനം സങ്കീർണ്ണമായ അന്വേഷണങ്ങളുടെ ഫലങ്ങൾ സംഭരിക്കുന്നതിന്, ആവർത്തിച്ചുള്ള ഡാറ്റാ പ്രോസസ്സിംഗിൻ്റെ ആവശ്യകത കുറയ്ക്കുന്നതിന് ഭൗതികമായ കാഴ്ചകളെ സ്വാധീനിക്കുന്നു.
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: ഷെഡ്യൂൾ ചെയ്ത അപ്ഡേറ്റുകൾക്കായി SQL സെർവർ ഏജൻ്റ് ജോലികളുമായുള്ള സമീപനം
നിങ്ങൾക്ക് ഷെഡ്യൂൾ ചെയ്ത അടിസ്ഥാനത്തിൽ പട്ടിക അപ്ഡേറ്റ് ചെയ്യണമെങ്കിൽ, മാനുവൽ എക്സിക്യൂഷൻ്റെ ആവശ്യകത ഒഴിവാക്കിക്കൊണ്ട് നിർദ്ദിഷ്ട ഇടവേളകളിൽ അപ്ഡേറ്റ് പ്രോസസ്സ് നടപ്പിലാക്കുന്ന ജോലികൾ സൃഷ്ടിക്കാൻ SQL സെർവർ ഏജൻ്റ് ഉപയോഗിക്കാം.
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';
സ്ക്രിപ്റ്റുകളിൽ ഉപയോഗിച്ചിരിക്കുന്ന പ്രത്യേക SQL കമാൻഡുകളുടെ വിശദീകരണം
വലിയ ടേബിളുകൾക്കായി SQL സെർവർ സ്ക്രിപ്റ്റുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നു
SQL സെർവറിൽ വലിയ ടേബിളുകളിൽ പ്രവർത്തിക്കുമ്പോൾ, ടേബിൾ ഘടനയിൽ മാറ്റം വരുത്തുമ്പോഴും നിലവിലുള്ള വരികൾ അപ്ഡേറ്റ് ചെയ്യുമ്പോഴും പെർഫോമൻസ് ഒപ്റ്റിമൈസേഷൻ ടെക്നിക്കുകൾ പരിഗണിക്കേണ്ടത് പ്രധാനമാണ്. വലിയ ടേബിളുകളിൽ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കുമ്പോൾ നേരിടുന്ന ഏറ്റവും സാധാരണമായ പ്രശ്നങ്ങളിലൊന്ന്, ഈ പ്രവർത്തനങ്ങൾ പൂർത്തിയാകാൻ എടുക്കുന്ന സമയമാണ്, പ്രത്യേകിച്ചും ഒരു ടേബിളിൽ ഒരു ദശലക്ഷത്തിലധികം വരികൾ അടങ്ങിയിരിക്കുമ്പോൾ. എന്നതിനൊപ്പം ഒരു കോളം ചേർക്കുന്നത് പോലെയുള്ള പ്രസ്തുത പ്രവർത്തനങ്ങൾ ആൾട്ടർ ടേബിൾ നിർദ്ദിഷ്ട തീയതി വ്യവസ്ഥകളെ അടിസ്ഥാനമാക്കി കമാൻഡ് ചെയ്യുന്നതിനും വരികൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിനും ഗണ്യമായ സമയമെടുക്കും. പ്രകടനത്തിന് മുൻഗണന നൽകുന്ന പ്രൊഡക്ഷൻ ഡാറ്റാബേസുകളിൽ നിങ്ങൾ പ്രവർത്തിക്കുമ്പോൾ ഈ പ്രവർത്തനങ്ങൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നത് കൂടുതൽ പ്രധാനമാണ്. ഒരൊറ്റ സ്ക്രിപ്റ്റിന്, മറ്റ് ചോദ്യങ്ങളെയും ഉപയോക്താക്കളെയും ബാധിക്കുന്ന ടേബിൾ ദീർഘനാളത്തേക്ക് ലോക്ക് ചെയ്യാൻ സാധ്യതയുണ്ട്.
പ്രകടന പ്രശ്നങ്ങൾ ലഘൂകരിക്കുന്നതിന്, ടാസ്ക്കുകളെ ചെറിയ ഘട്ടങ്ങളായി വിഭജിക്കുക എന്നതാണ് ഏറ്റവും മികച്ച സമീപനങ്ങളിലൊന്ന്. ഉദാഹരണത്തിന്, ഒരു കോളം ചേർക്കുകയും എല്ലാ വരികളും ഒരൊറ്റ സ്ക്രിപ്റ്റിൽ അപ്ഡേറ്റ് ചെയ്യുകയും ചെയ്യുന്നതിനുപകരം, റൺ ചെയ്യുന്നത് പരിഗണിക്കുക ആൾട്ടർ ടേബിൾ കമാൻഡ് വെവ്വേറെ, തുടർന്ന് ബാച്ച് ചെയ്യുക UPDATE പ്രവർത്തനങ്ങൾ. ചെറിയ ഭാഗങ്ങളായി റെക്കോർഡുകൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിലൂടെ, സ്ക്രിപ്റ്റ് സെർവറിനെ മറികടക്കില്ല. നിങ്ങൾക്ക് പ്രയോജനപ്പെടുത്താം UPDATE TOP ഓരോ ഇടപാടിലും ബാധിച്ച വരികളുടെ എണ്ണം പരിമിതപ്പെടുത്താനുള്ള കമാൻഡ്. കൂടാതെ, നിങ്ങളുടേതിൽ ഉപയോഗിക്കുന്ന നിരകളിൽ സൂചികകൾ സൃഷ്ടിക്കുന്നതും നല്ലതാണ് WHERE ഉപവാക്യങ്ങൾ (ഉദാ LOAD_DATE) തിരയൽ പ്രക്രിയ വേഗത്തിലാക്കാൻ. വലിയ ഡാറ്റാസെറ്റുകൾക്ക്, തീയതി ശ്രേണികളെ അടിസ്ഥാനമാക്കി വരികൾ ഫിൽട്ടർ ചെയ്യാൻ എടുക്കുന്ന സമയം സൂചികകൾ കുറയ്ക്കുന്നു.
പ്രവർത്തനങ്ങൾ ആറ്റോമികമായി നിർവ്വഹിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ ഇടപാടുകളുടെയും പിശക് കൈകാര്യം ചെയ്യുന്നതിൻ്റെയും ഉപയോഗമാണ് മറ്റൊരു പ്രധാന പരിഗണന. നിങ്ങളുടെ പൊതിയുന്നതിലൂടെ UPDATE ഉള്ളിലുള്ള പ്രസ്താവനകൾ a BEGIN TRANSACTION ഒപ്പം COMMIT, മാറ്റങ്ങൾ സുരക്ഷിതവും സ്ഥിരവുമായ രീതിയിലാണെന്ന് നിങ്ങൾ ഉറപ്പാക്കുന്നു. പ്രക്രിയയുടെ ഏതെങ്കിലും ഭാഗം പരാജയപ്പെടുകയാണെങ്കിൽ, നിങ്ങൾക്ക് ഉപയോഗിക്കാം ROLLBACK ഭാഗികമായ അപ്ഡേറ്റുകൾ തടയുന്ന, മാറ്റങ്ങൾ പഴയപടിയാക്കാൻ. കൂടാതെ, തിരക്കില്ലാത്ത സമയങ്ങളിൽ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കുകയോ ഈ പ്രവർത്തനങ്ങൾ ഷെഡ്യൂൾ ചെയ്യുന്നതിന് SQL സെർവർ ഏജൻ്റ് ഉപയോഗിക്കുകയോ ചെയ്യുന്നത് സിസ്റ്റം പ്രകടനത്തിൽ കുറഞ്ഞ സ്വാധീനം ഉറപ്പാക്കുന്നു. ഈ ഒപ്റ്റിമൈസേഷനുകൾ ഉപയോഗിച്ച്, സിസ്റ്റം സമഗ്രത നിലനിർത്തിക്കൊണ്ട് നിങ്ങൾക്ക് വലിയ പട്ടികകളിൽ സങ്കീർണ്ണമായ പരിഷ്ക്കരണങ്ങൾ സുരക്ഷിതമായി നടപ്പിലാക്കാൻ കഴിയും. 🖥️
SQL സെർവർ ടേബിൾ പരിഷ്ക്കരണങ്ങളെക്കുറിച്ച് പതിവായി ചോദിക്കുന്ന ചോദ്യങ്ങൾ
- SQL സെർവറിലെ ഒരു പട്ടികയിലേക്ക് ഒരു പുതിയ കോളം എങ്ങനെ ചേർക്കാം?
- ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഒരു പുതിയ കോളം ചേർക്കാം ALTER TABLE കമാൻഡ്. ഉദാഹരണത്തിന്: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; IS_CURRENT എന്ന് പേരുള്ള ഒരു കോളം BIT-ൻ്റെ ഒരു ഡാറ്റാ തരത്തിനൊപ്പം ചേർക്കുന്നു.
- SQL സെർവറിൽ ഒരു പ്രത്യേക ശ്രേണി വരികൾ മാത്രം എനിക്ക് എങ്ങനെ അപ്ഡേറ്റ് ചെയ്യാം?
- ഉപയോഗിക്കുക UPDATE a ഉള്ള കമാൻഡ് WHERE വരികൾ ഫിൽട്ടർ ചെയ്യുന്നതിനുള്ള വ്യവസ്ഥ. ഉദാഹരണത്തിന്: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- എന്തുകൊണ്ടാണ് എൻ്റെ സ്ക്രിപ്റ്റ് "അസാധുവായ നിരയുടെ പേര്" പിശക് എറിയുന്നത്?
- എങ്കിൽ ഈ പിശക് സംഭവിക്കുന്നു ALTER TABLE പ്രവർത്തിപ്പിക്കുന്നതിന് മുമ്പ് കമാൻഡ് പൂർണ്ണമായി പ്രതിജ്ഞാബദ്ധമല്ല UPDATE പ്രസ്താവന. ഇത് ഒഴിവാക്കാൻ, പ്രവർത്തിപ്പിക്കുക ALTER TABLE ആദ്യം കമാൻഡ് ചെയ്യുക, കോളം ചേർക്കുന്നത് വരെ കാത്തിരിക്കുക, തുടർന്ന് എക്സിക്യൂട്ട് ചെയ്യുക UPDATE പ്രത്യേകം ചോദ്യങ്ങൾ.
- പ്രകടനം മെച്ചപ്പെടുത്താൻ ബാച്ചുകളിൽ വരികൾ എങ്ങനെ അപ്ഡേറ്റ് ചെയ്യാം?
- ഉപയോഗിക്കുക UPDATE TOP ഒരേസമയം അപ്ഡേറ്റ് ചെയ്ത വരികളുടെ എണ്ണം പരിമിതപ്പെടുത്താനുള്ള കമാൻഡ്. ഉദാഹരണത്തിന്: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
- ആറ്റോമിക് അപ്ഡേറ്റുകൾ ഉറപ്പാക്കാൻ എനിക്ക് ഒരു ഇടപാട് ഉപയോഗിക്കാനാകുമോ?
- അതെ! നിങ്ങളുടെ പൊതിയുക UPDATE എയിലെ പ്രസ്താവനകൾ BEGIN TRANSACTION ഒപ്പം COMMIT എല്ലാ അപ്ഡേറ്റുകളും ഒരൊറ്റ യൂണിറ്റായി പ്രയോഗിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ തടയുക. എന്തെങ്കിലും പിശകുകൾ സംഭവിച്ചാൽ, ഉപയോഗിക്കുക ROLLBACK മാറ്റങ്ങൾ പഴയപടിയാക്കാൻ.
- SQL സെർവറിലെ വലിയ അപ്ഡേറ്റുകളുടെ പ്രകടനം ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിനുള്ള മികച്ച മാർഗം ഏതാണ്?
- അപ്ഡേറ്റിനെ ചെറിയ ഭാഗങ്ങളായി വിഭജിക്കുന്നതും പ്രസക്തമായ കോളങ്ങളിൽ സൂചികകൾ സൃഷ്ടിക്കുന്നതും തിരക്കില്ലാത്ത സമയങ്ങളിൽ സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിക്കുന്നതും പരിഗണിക്കുക. കൂടാതെ, ഉപയോഗിക്കുന്നത് UPDATE TOP ലോക്കിംഗ് പ്രശ്നങ്ങൾ ഒഴിവാക്കാനും വിഭവ ഉപഭോഗം കുറയ്ക്കാനും രീതി സഹായിക്കുന്നു.
- എസ്ക്യുഎൽ സെർവറിൽ എനിക്ക് എങ്ങനെ തീയതി താരതമ്യങ്ങൾ കൂടുതൽ ചലനാത്മകമാക്കാം?
- പോലുള്ള തീയതി ഫംഗ്ഷനുകൾ ഉപയോഗിക്കുക DATEADD ഒപ്പം DATEDIFF ഡൈനാമിക് തീയതി കണക്കുകൂട്ടലുകൾ നടത്താൻ. ഉദാഹരണത്തിന്, 60 ദിവസം മുമ്പ് ഒരു തീയതി സജ്ജീകരിക്കാൻ, DATEADD(DAY, -60, GETDATE()) ഉപയോഗിക്കുക.
- ഒരു തീയതിയെ അടിസ്ഥാനമാക്കി ദശലക്ഷക്കണക്കിന് വരികൾ അപ്ഡേറ്റ് ചെയ്യണമെങ്കിൽ ഞാൻ എന്തുചെയ്യണം?
- മികച്ച പ്രകടനത്തിനായി സൂചികയിലാക്കിയ നിരകൾ ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക. കൂടാതെ, നിങ്ങളുടെ അപ്ഡേറ്റ് ചെറിയ ഇടപാടുകളായി വിഭജിച്ച് ഉപയോഗിക്കുക UPDATE TOP ബാച്ചുകളിൽ വരികൾ അപ്ഡേറ്റ് ചെയ്യാൻ.
- ഒരു വലിയ ടേബിൾ അപ്ഡേറ്റ് ചെയ്യുമ്പോൾ ലോക്കിംഗ് പ്രശ്നങ്ങൾ എങ്ങനെ ഒഴിവാക്കാം?
- ലോക്കിംഗ് പ്രശ്നങ്ങൾ തടയാൻ, അപ്ഡേറ്റുകളെ ചെറിയ ബാച്ചുകളായി വിഭജിക്കാൻ ശ്രമിക്കുക, ഘട്ടങ്ങളിൽ മാറ്റങ്ങൾ വരുത്താൻ ഇടപാടുകൾ ഉപയോഗിക്കുക, കുറഞ്ഞ ഉപയോഗ സമയങ്ങളിൽ അപ്ഡേറ്റ് പ്രവർത്തിപ്പിക്കുന്നത് പരിഗണിക്കുക.
- എനിക്ക് SQL സെർവറിൽ വലിയ അപ്ഡേറ്റ് സ്ക്രിപ്റ്റുകൾ ഷെഡ്യൂൾ ചെയ്യാൻ കഴിയുമോ?
- അതെ, സിസ്റ്റം പ്രകടനത്തിലെ ആഘാതം കുറയ്ക്കുന്നതിന് തിരക്കില്ലാത്ത സമയങ്ങളിൽ വലിയ അപ്ഡേറ്റ് സ്ക്രിപ്റ്റുകൾ ഷെഡ്യൂൾ ചെയ്യാൻ SQL സെർവർ ഏജൻ്റ് ഉപയോഗിക്കാം. SQL സെർവർ ഏജൻ്റിൽ ജോലി സൃഷ്ടിക്കുകയും ആവശ്യമുള്ള ഷെഡ്യൂൾ സജ്ജമാക്കുകയും ചെയ്യുക.
SQL സെർവറിൽ വലിയ പട്ടിക പരിഷ്ക്കരണങ്ങൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നു
വലിയ ടേബിളുകൾ പരിഷ്ക്കരിക്കുന്നതിന് SQL സെർവറുമായി പ്രവർത്തിക്കുമ്പോൾ, നിങ്ങളുടെ പ്രവർത്തനങ്ങൾ തകർക്കുന്നത് പ്രകടനം മെച്ചപ്പെടുത്തുന്നതിന് പ്രധാനമാണ്. ദശലക്ഷക്കണക്കിന് വരികളുള്ള ഒരു പട്ടികയിലേക്ക് ഒരു കോളം ചേർക്കുന്നതും നിർദ്ദിഷ്ട വ്യവസ്ഥകളെ അടിസ്ഥാനമാക്കി ഡാറ്റ അപ്ഡേറ്റ് ചെയ്യുന്നതും ഒരു വെല്ലുവിളിയാണ്. ഇത് പോലുള്ള കമാൻഡുകളുടെ തന്ത്രപരമായ നിർവ്വഹണം ആവശ്യമാണ് ആൾട്ടർ ടേബിൾ ഒപ്പം UPDATE സിസ്റ്റത്തെ അടിച്ചമർത്താതെ മാറ്റങ്ങൾ പ്രയോഗിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ.
കൂടാതെ, ബാച്ചിംഗ് അപ്ഡേറ്റുകൾ, ഇൻഡെക്സിംഗ് ഉപയോഗിക്കൽ, തിരക്കില്ലാത്ത സമയങ്ങളിൽ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കുക തുടങ്ങിയ മികച്ച സമ്പ്രദായങ്ങൾ നടപ്പിലാക്കുന്നത് ടേബിൾ ലോക്കിംഗ്, പെർഫോമൻസ് ഡിഗ്രേഡേഷൻ തുടങ്ങിയ പ്രശ്നങ്ങൾ തടയാൻ സഹായിക്കും. ജോലിഭാരം വിഭജിക്കുന്നതിലൂടെയും ചോദ്യങ്ങൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിലൂടെയും, പ്രവർത്തനരഹിതമായ സമയമോ "അസാധുവായ കോളത്തിൻ്റെ പേര്" പോലെയുള്ള പിശകുകളോ ഉണ്ടാക്കാതെ നിങ്ങൾക്ക് സുരക്ഷിതമായി വലിയ തോതിലുള്ള മാറ്റങ്ങൾ വരുത്താനാകും. 💻
റഫറൻസുകളും ഉറവിടങ്ങളും
- SQL സെർവറിൽ പട്ടികകൾ മാറ്റുന്നതിനും ഡാറ്റ അപ്ഡേറ്റ് ചെയ്യുന്നതിനുമുള്ള പ്രക്രിയ വിശദമാക്കുന്നു. പട്ടികകൾ മാറ്റുന്നതിനെക്കുറിച്ചും മികച്ച രീതികളെക്കുറിച്ചും കൂടുതലറിയാൻ, കാണുക Microsoft SQL സെർവർ ഡോക്യുമെൻ്റേഷൻ .
- വലിയ പട്ടികകളിൽ പ്രവർത്തിക്കുന്നതിനും SQL കമാൻഡുകൾ ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിനുമുള്ള സ്ഥിതിവിവരക്കണക്കുകൾ നൽകുന്നു SQL ഷാക്ക് .
- SQL-ൽ ലഭ്യമായ തീയതി അടിസ്ഥാനമാക്കിയുള്ള സോപാധിക അപ്ഡേറ്റുകളുടെയും ഇൻഡെക്സിംഗിൻ്റെയും പ്രാധാന്യം വിശദീകരിക്കുന്നു SQL സെർവർ സെൻട്രൽ .