SQL सर्वर में सभी तालिकाओं के सभी अनुक्रमणिका को फिर से बनाने की कई विधियाँ हैं, उनमें से:
- SQL सर्वर रखरखाव योजनाओं का उपयोग करना।
- विखंडन प्रतिशत के आधार पर T-SQL स्क्रिप्ट का उपयोग करना।
- ALTER INDEX कमांड का उपयोग करना।
इस लेख में, हम इन विधियों का पता लगाएंगे और व्यावहारिक उदाहरणों के साथ उनका वर्णन करेंगे।
1. एसक्यूएल सर्वर पुनर्निर्माण सूचकांक रखरखाव योजना
समीक्षा करने का पहला विकल्प डेटाबेस रखरखाव योजनाओं के साथ अनुक्रमणिका का पुनर्निर्माण करना है। रखरखाव योजनाएँ SQL सर्वर प्रबंधन स्टूडियो के प्रबंधन फ़ोल्डर के अंतर्गत उपलब्ध हैं।
SQL डेटाबेस रखरखाव योजना बनाने के लिए, SQL सर्वर प्रबंधन स्टूडियो लॉन्च करें > डेटाबेस उदाहरण का विस्तार करें > प्रबंधन > रखरखाव योजना पर राइट-क्लिक करें > नई रखरखाव योजना ।
रखरखाव योजना का नाम निर्दिष्ट करें। फिर, खींचें और छोड़ें सूचकांक कार्य का पुनर्निर्माण करें रखरखाव योजना डिजाइनर में। कार्य का नाम बदलकर इंडेक्स रखरखाव . करें ।
अगला चरण रखरखाव योजना को कॉन्फ़िगर कर रहा है। उस पर डबल-क्लिक करें और इंडेक्स टास्क का पुनर्निर्माण करें . पर विकल्पों को कॉन्फ़िगर करें इस प्रकार है:
<उल प्रकार ="1">अब, हम शेड्यूल को कॉन्फ़िगर करते हैं।
कैलेंडर . पर क्लिक करें रखरखाव योजना डिजाइनर के शीर्ष पर आइकन:
नई कार्य अनुसूची विंडो खुल जाएगी। आइए निम्नलिखित सेटिंग्स को कॉन्फ़िगर करें:
- कार्य को प्रतिदिन चलाएं। अनुसूची प्रकार . में मेनू में, हम आवर्ती . का चयन करते हैं . फिर, आवृत्ति . में अनुभाग में, हम होता है . का चयन करते हैं > दैनिक ।
- प्रत्येक की पुनरावृत्ति होती है > 1 (दिन)।
- दैनिक आवृत्ति > एक बार होता है > सटीक समय निर्दिष्ट करें। हमारे मामले में, यह 1 बजे है।
- क्लिक करें ठीक ।
उसके बाद, रखरखाव योजना सहेजें।
निर्मित रखरखाव योजनाएँ SSMS में उपलब्ध हैं रखरखाव योजना निर्देशिका। विशेष रखरखाव योजना से संबंधित कार्यक्रम देखने के लिए, नौकरियां . देखें SQL सर्वर एजेंट . के अंतर्गत निर्देशिका ।
कार्य का परीक्षण करने के लिए, रखरखाव योजनाओं में उसके नाम पर राइट-क्लिक करें निर्देशिका, और निष्पादित करें . चुनें मेनू से:
निष्पादन शुरू होता है। जब यह सफलतापूर्वक पूरा हो जाता है, तो आपको निम्न संवाद बॉक्स दिखाई देगा:
रखरखाव योजनाओं के साथ अनुक्रमणिका के पुनर्निर्माण का यह सामान्य तरीका था। अब, अगली विधि पर चलते हैं - टी-एसक्यूएल स्क्रिप्ट का उपयोग करना।
2. SQL सर्वर ALTER INDEX फिर से बनाएं
ALTER INDEX कमांड का उपयोग टेबल के सभी इंडेक्स को फिर से बनाने के लिए किया जा सकता है। सिंटैक्स निम्न है:
ALTER INDEX ALL ON [table_name] REBUILD
नोट:table_name पैरामीटर उस तालिका का नाम निर्दिष्ट करता है जहां हम SQL सर्वर में सभी अनुक्रमणिका का पुनर्निर्माण करना चाहते हैं।
उदाहरण के लिए, हम [HumanResources].[कर्मचारी] की सभी अनुक्रमणिकाओं का पुनर्निर्माण करना चाहते हैं। . क्वेरी इस प्रकार होनी चाहिए:
use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go
3. Fragmentation के आधार पर सभी तालिकाओं के लिए सभी अनुक्रमणिका के पुनर्निर्माण के लिए SQL सर्वर स्क्रिप्ट
सूचकांक रखरखाव संसाधन-गहन है। इसके अलावा, यह उस तालिका को लॉक कर देता है जहां यह सूचकांक का पुनर्निर्माण कर रहा है। ऐसी जटिलताओं से बचने के लिए, हमें उस इंडेक्स को फिर से बनाना होगा जहां SQL सर्वर इंडेक्स फ़्रेग्मेंटेशन 40% से अधिक है।
मामले को स्पष्ट करने के लिए, मैंने एक टी-एसक्यूएल स्क्रिप्ट बनाई है जो इंडेक्स को 30% से अधिक विखंडन डिग्री के साथ पुनर्निर्माण करती है। आइए इसके भागों और कार्यों के बारे में जानें।
चर और अस्थायी तालिका घोषणा
सबसे पहले, हमें अस्थायी तालिकाएँ और चर बनाने की आवश्यकता है:
- @IndexFregQuery - खंडित अनुक्रमणिका को पॉप्युलेट करने के लिए उपयोग की जाने वाली गतिशील क्वेरी को संग्रहीत करता है।
- @IndexRebuildQuery - ALTER INDEX क्वेरी रखता है।
- @IndexName - इंडेक्स नाम जिसे हम फिर से बनाना चाहते हैं
- @TableName - टेबल का नाम जहां हम इंडेक्स को फिर से बनाना चाहते हैं।
- @SchemaName - स्कीमा नाम जहां हम इंडेक्स को फिर से बनाना चाहते हैं।
- #Fregmentedindex – 3-स्तंभ तालिका जो अनुक्रमणिका नाम, तालिका का नाम और स्कीमा नाम संग्रहीत करता है।
निम्नलिखित कोड हमारे चर और अस्थायी तालिका की घोषणा करता है:
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
विखंडित अनुक्रमणिका की सूची प्राप्त करें
हमारा अगला कदम इंडेक्स की सूची को 30% या उससे अधिक की विखंडन डिग्री के साथ पॉप्युलेट करना है। हमें उन अनुक्रमणिकाओं को #FregmentedIndexes . में सम्मिलित करना होगा टेबल।
क्वेरी को स्कीमा नाम, तालिका नाम और अनुक्रमणिका नाम को अस्थायी तालिका में सम्मिलित करने के लिए पॉप्युलेट करना होगा। उस प्रश्न पर एक नज़र डालें:
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
FROM [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
एक गतिशील SQL क्वेरी बनाएं
अंत में, हमें डायनामिक ALTER INDEX . बनाना होगा आदेश दें और इसे निष्पादित करें।
कमांड जनरेट करने के लिए, हम WHILE लूप का उपयोग कर रहे हैं। यह #FregmentedIndexes . के माध्यम से पुनरावृति करता है तालिका और स्कीमा नाम, तालिका नाम और अनुक्रमणिका नाम को @SchemaName में सहेजने के लिए पॉप्युलेट करता है , @TableName , और @IndexName . पैरामीटर के मान ALTER INDEX कमांड में जोड़े जाते हैं।
कोड निम्नलिखित है:
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
मैंने पूरे कोड को sp_index_maintenance . में इनकैप्सुलेट कर दिया है DBATools . में बनाई गई संग्रहीत कार्यविधि डेटाबेस। कोड निम्नलिखित है:
use DBATools
go
Create procedure sp_index_maintenance_daily
@DatabaseName varchar(50)
as
begin
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
FROM [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
End
एक बार प्रक्रिया तैयार हो जाने के बाद, हम SQL जॉब को कॉन्फ़िगर कर सकते हैं।
विस्तृत करें SQL सर्वर एजेंट > नौकरियों पर राइट-क्लिक करें > नई नौकरी ।
नई नौकरी विंडो खुलती है जहां आपको वांछित नौकरी का नाम निर्दिष्ट करना चाहिए।
कार्य चरण बनाने के लिए, चरणों . पर नेविगेट करें अनुभाग> नया बटन:
आप नए कार्य चरण पर पहुंच जाएंगे उस चरण को कॉन्फ़िगर करने के लिए विंडो।
वांछित चरण का नाम दर्ज करें और टेक्स्ट बॉक्स में निम्नलिखित कोड दर्ज करें:
use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'
शेड्यूल कॉन्फ़िगर करने के लिए, अनुसूची पर जाएं > क्लिक करें नया ।
हमारा काम दोपहर 1:00 बजे निष्पादित किया जाना चाहिए। तदनुसार, हम शेड्यूल को कॉन्फ़िगर करते हैं:
- अनुसूची प्रकार > आवर्ती ।
- द आवृत्ति अनुभाग> होता है > दैनिक ; प्रत्येक की पुनरावृत्ति करता है > 1 (एक)।
- दैनिक आवृत्ति अनुभाग> एक बार होता है > 01:00:00.
- क्लिक करें ठीक ।
आपको नई नौकरी . पर वापस स्थानांतरित कर दिया जाएगा खंड। ठीकक्लिक करें वहाँ भी नौकरी पैदा करने के लिए।
नव निर्मित कार्य नौकरियों . में उपलब्ध है SQL सर्वर एजेंट के अंतर्गत निर्देशिका फ़ोल्डर।
अब हमें कार्य का परीक्षण करने की आवश्यकता है:उस पर राइट-क्लिक करें और नौकरी शुरू करें … . चुनें
कार्य शुरू होता है, और सफलतापूर्वक पूरा होने पर, आपको निम्न संदेश दिखाई देगा:
यदि हम क्लस्टर्ड इंडेक्स बनाम गैर-क्लस्टर इंडेक्स की तुलना करते हैं, तो हम देखेंगे कि एक अद्वितीय क्लस्टर इंडेक्स बनाने से क्वेरी प्रदर्शन की दक्षता बढ़ जाती है। SQL सर्वर में अनुक्रमित दृश्यों का उपयोग क्वेरी निष्पादन को गति देने के लिए किया जा सकता है। SQL अनुक्रमणिका प्रबंधक का उपयोग करके अनुक्रमणिका प्रबंधित करने का तरीका भी देखें।
सारांश
वर्तमान लेख ने सभी तालिकाओं के अनुक्रमणिका के पुनर्निर्माण के तीन कार्यात्मक तरीके प्रस्तुत किए हैं। हमने कार्य कॉन्फ़िगरेशन को स्पष्ट करने के लिए चरण-दर-चरण दिशानिर्देशों और व्यावहारिक SQL अनुक्रमणिका उदाहरणों के साथ उन सभी का पता लगाया है। उपयुक्त संस्करण का चुनाव आपका है, और हम आशा करते हैं कि यह लेख आपके लिए मददगार रहा होगा।