Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर डेटाबेस में T-SQL के साथ सभी तालिकाओं के लिए सभी अनुक्रमणिका के पुनर्निर्माण के लिए 3 तरीके

SQL सर्वर में सभी तालिकाओं के सभी अनुक्रमणिका को फिर से बनाने की कई विधियाँ हैं, उनमें से:

  1. SQL सर्वर रखरखाव योजनाओं का उपयोग करना।
  2. विखंडन प्रतिशत के आधार पर T-SQL स्क्रिप्ट का उपयोग करना।
  3. ALTER INDEX कमांड का उपयोग करना।

इस लेख में, हम इन विधियों का पता लगाएंगे और व्यावहारिक उदाहरणों के साथ उनका वर्णन करेंगे।

1. एसक्यूएल सर्वर पुनर्निर्माण सूचकांक रखरखाव योजना

समीक्षा करने का पहला विकल्प डेटाबेस रखरखाव योजनाओं के साथ अनुक्रमणिका का पुनर्निर्माण करना है। रखरखाव योजनाएँ SQL सर्वर प्रबंधन स्टूडियो के प्रबंधन फ़ोल्डर के अंतर्गत उपलब्ध हैं।

SQL डेटाबेस रखरखाव योजना बनाने के लिए, SQL सर्वर प्रबंधन स्टूडियो लॉन्च करें > डेटाबेस उदाहरण का विस्तार करें > प्रबंधन > रखरखाव योजना पर राइट-क्लिक करें > नई रखरखाव योजना

रखरखाव योजना का नाम निर्दिष्ट करें। फिर, खींचें और छोड़ें सूचकांक कार्य का पुनर्निर्माण करें रखरखाव योजना डिजाइनर में। कार्य का नाम बदलकर इंडेक्स रखरखाव . करें

अगला चरण रखरखाव योजना को कॉन्फ़िगर कर रहा है। उस पर डबल-क्लिक करें और इंडेक्स टास्क का पुनर्निर्माण करें . पर विकल्पों को कॉन्फ़िगर करें इस प्रकार है:

<उल प्रकार ="1">
  • चुनें AdventureWorks2017 डेटाबेस (डेटाबेस) ड्रॉप-डाउन मेनू से डेटाबेस।
  • सभी तालिकाओं की अनुक्रमणिका को फिर से बनाने के लिए, तालिकाएं और दृश्य select चुनें वस्तु . से ड्रॉप-डाउन बॉक्स।
  • चेक करें परिणामों को tempdb में क्रमित करें
  • MAXDOP - सेट करें 2 (दो)।
  • हमारे मामले में, हम अनुक्रमणिका का पुनर्निर्माण तभी करेंगे जब विखंडन मूल्य 20% से अधिक है। इसलिए, 20 . सेट करें संबंधित क्षेत्र में।
  • ठीकक्लिक करें अनुक्रमणिका कॉन्फ़िगरेशन को सहेजने के लिए और अनुक्रमणिका कार्य का पुनर्निर्माण करें . को बंद करें खिड़की।
  • अब, हम शेड्यूल को कॉन्फ़िगर करते हैं।

    कैलेंडर . पर क्लिक करें रखरखाव योजना डिजाइनर के शीर्ष पर आइकन:

    नई कार्य अनुसूची विंडो खुल जाएगी। आइए निम्नलिखित सेटिंग्स को कॉन्फ़िगर करें:

    • कार्य को प्रतिदिन चलाएं। अनुसूची प्रकार . में मेनू में, हम आवर्ती . का चयन करते हैं . फिर, आवृत्ति . में अनुभाग में, हम होता है . का चयन करते हैं > दैनिक
    • प्रत्येक की पुनरावृत्ति होती है > 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 अनुक्रमणिका उदाहरणों के साथ उन सभी का पता लगाया है। उपयुक्त संस्करण का चुनाव आपका है, और हम आशा करते हैं कि यह लेख आपके लिए मददगार रहा होगा।


    1. Database
    2.   
    3. Mysql
    4.   
    5. Oracle
    6.   
    7. Sqlserver
    8.   
    9. PostgreSQL
    10.   
    11. Access
    12.   
    13. SQLite
    14.   
    15. MariaDB
    1. SQL सर्वर में एक पूर्णांक को दशमलव में बदलने के 3 तरीके

    2. आइडेंटिटी कॉलम के साथ टेबल कैसे बनाएं

    3. SQL सर्वर (T-SQL) में डेटाबेस मेल प्रोफ़ाइल के लिए msdb उपयोगकर्ता पहुँच प्रदान करें

    4. एक्सएमएल पथ (''), 1,1) के लिए चयन ... का अर्थ क्या है?

    5. संग्रहित प्रक्रियाओं के भीतर से परिणाम सेट तक पहुंच ट्रांजैक्ट-एसक्यूएल एसक्यूएल सर्वर