SQL 2017 ने डेटाबेस रखरखाव के दौरान अनुक्रमणिका पुनर्निर्माण कार्यों को रोकने और फिर से शुरू करने की क्षमता पेश की। यह सुविधा डेटाबेस प्रशासकों को अधिक लचीलापन प्रदान करती है क्योंकि यह उन्हें ऑफ़लाइन और ऑनलाइन रीइंडेक्सिंग के बीच चयन करने की अनुमति देती है, साथ ही जब भी आवश्यक हो, इंडेक्स को फिर से बनाना और फिर से शुरू करना।
पुन:प्रारंभ करने योग्य अनुक्रमणिका के जारी होने से पहले, डेटाबेस व्यवस्थापक ऑफ़लाइन index अनुक्रमणिका पुनर्निर्माण निष्पादित कर सकते थे और ऑनलाइन ।
ऑफ़लाइन तेजी से निष्पादन प्रदान करता है, क्योंकि तालिका किसी भी पढ़ने . के लिए बंद है या लिखें ऑपरेशन, और नया इंडेक्स पुराने इंडेक्स से बनाया गया है। इस प्रक्रिया के दौरान, किसी भी पढ़ने या लिखने के संचालन की अनुमति नहीं है। जब ऑपरेशन किया जाता है, तो टेबल लॉक जारी किया जाता है, और पढ़ने और लिखने के संचालन को फिर से अनुमति दी जाती है। ऑफ़लाइन विकल्प स्वाभाविक रूप से तेज़ है।
ऑनलाइन पढ़ने . के लिए टेबल को खुला रखता है और लिखें संचालन। इंडेक्स की एक और कॉपी बनाई गई है, और सभी इंडेक्स पुनर्निर्माण ऑपरेशन उस कॉपी में हैं। सभी नई पंक्तियों के संचालन दोनों अनुक्रमितों के लिए लिखे गए हैं। जब पुनर्निर्माण पूरा हो जाता है, तो स्विच किया जाता है, और नई अनुक्रमणिका प्रति उपयोग में आती है। ऑनलाइन डेटाबेस ऑनलाइन होने पर पुनर्निर्माण संचालन के पुनर्निर्माण की अनुमति देता है। डाउनटाइम न्यूनतम है।
ध्यान दें कि पुन:प्रारंभ करने योग्य अनुक्रमणिका सुविधा केवल SQL सर्वर एंटरप्राइज़ संस्करण और निःशुल्क डेवलपर संस्करण में उपलब्ध है। यदि आपके पास टेबल पर यह विकल्प है, तो आप इसके साथ खेल सकते हैं, एक साधारण परीक्षण कर सकते हैं, और देख सकते हैं कि यह सुविधा आपके मामले में उपयोगी है या नहीं।
Microsoft दस्तावेज़ आपके विचारों के लिए निम्नलिखित पहलुओं को बताता है:
- आप इंडेक्स रखरखाव विंडो का प्रबंधन, योजना और विस्तार कर सकते हैं। जब आपको अपनी रखरखाव विंडो फिट करने की आवश्यकता हो, तो आप इंडेक्स निर्माण या पुनर्निर्माण के संचालन को रोक सकते हैं और पुनः आरंभ कर सकते हैं।
- आप अनुक्रमणिका से पुनर्प्राप्त कर सकते हैं या विफलताओं का पुनर्निर्माण कर सकते हैं (जैसे डेटाबेस विफलता या डिस्क स्थान से बाहर चल रहा है)।
- ध्यान दें कि जब कोई इंडेक्स ऑपरेशन रोक दिया जाता है, तो मूल इंडेक्स और नए बनाए गए दोनों को डिस्क स्थान की आवश्यकता होगी। डीएमएल संचालन के दौरान आपको उन्हें अपडेट करना होगा।
- आप इंडेक्स बनाने या फिर से बनाने के संचालन के दौरान लेन-देन लॉग को छोटा कर सकते हैं।
- ध्यान दें कि SORT_IN_TEMPDB=ON विकल्प समर्थित नहीं है
आइए पुन:प्रारंभ करने योग्य अनुक्रमणिका पुनर्निर्माण का परीक्षण करें। मैं SQL 2019 सर्वर डेवलपर संस्करण चलाने वाली एक कंटेनर छवि का उपयोग करूंगा। साथ ही, मैं केवल कुछ स्तंभों के साथ एक छोटी तालिका बनाउंगा, और उस तालिका में लगभग दस लाख पंक्तियां डालूंगा। आप अधिक पंक्तियों के साथ तालिका को बड़ा बना सकते हैं।
चूंकि मैं एक Linux मशीन का उपयोग कर रहा हूं और SQL सर्वर प्रबंधन स्टूडियो स्थापित नहीं कर सकता, मैं अपने SQL सर्वर से कनेक्ट करने के लिए Azure डेटा स्टूडियो क्लाइंट का उपयोग करूंगा। मेरे SQL सर्वर गुणों के स्क्रीनशॉट पर एक नज़र डालें:
हम नीचे टी-एसक्यूएल स्क्रिप्ट के साथ एक नमूना डेटाबेस, एक टेबल और एक इंडेक्स तैयार करेंगे। आप उन्हें SQL सर्वर के लिए SSMS या dbForge Studio के साथ त्रुटिपूर्ण तरीके से निष्पादित कर सकते हैं:
-- Create a new database called 'DatabaseName'
-- Connect to the 'master' database to run this snippet
USE master
GO
-- Create the new database if it does not exist already
IF NOT EXISTS (
SELECT [name]
FROM sys.databases
WHERE [name] = N'dbatools'
)
CREATE DATABASE dbatools
GO
Use dbatools
-- Create a new table called '[TableName]' in schema '[dbo]'
-- Drop the table if it already exists
IF OBJECT_ID('[dbo].[TabletoIndex]', 'U') IS NOT NULL
DROP TABLE [dbo].[TabletoIndex]
GO
-- Create the table in the specified schema
CREATE TABLE [dbo].[TabletoIndex]
(
[Id] INT NOT NULL PRIMARY KEY, -- Primary Key column
[ColumnName1] NVARCHAR(50) NOT NULL
-- Specify more columns here
);
GO
तालिका को यादृच्छिक डेटा से भरने के लिए, निम्न स्क्रिप्ट निष्पादित करें:
--populate the table
SET NOCOUNT ON
Declare @Id int
Set @Id = 1
While @Id <= 1000000
Begin
Insert Into TabletoIndex values (@Id, 'Name - ' + CAST(@Id as nvarchar(10))) Set @Id = @Id + 1
End
SELECT count(*) from TabletoIndex
एक आबादी वाली तालिका तैयार होने के साथ, हम फिर से शुरू करने योग्य सूचकांक पर आगे बढ़ सकते हैं। आइए उस अनुक्रमणिका को बनाने के साथ प्रारंभ करें:
-- Create a nonclustered index with or without a unique constraint -- Or create a clustered index on table '[TableName]' in schema '[dbo]' in database '[DatabaseName]'
CREATE UNIQUE INDEX IX_ID_Name ON [dbo].[TabletoIndex] (ID desc, [ColumnName1] DESC) WITH (SORT_IN_TEMPDB = OFF, RESUMABLE=ON, ONLINE = ON, MAX_DURATION=1) GO
उपरोक्त आदेश में नए विकल्पों/पैरामीटरों पर ध्यान दें। RESUMABLE=ON इसका मतलब है कि हम एक फिर से शुरू करने योग्य इंडेक्स ऑपरेशन करना चाहते हैं। अधिकतम_अवधि क्या यह मान मिनटों में यह परिभाषित करता है कि हम अनुक्रमण को कितने समय तक चलाना चाहते हैं।
जबकि उपरोक्त आदेश चल रहा है, एक और सत्र खोलें और नीचे दिए गए टी-एसक्यूएल कमांड को रोकें . पर निष्पादित करें चल रही पुनर्निर्माण गतिविधि:
--Rebuild WITH RESUMABLE functionality
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] PAUSE
GO
अगर रोकें कमांड सफल होता है, हम लगभग एक मिनट पहले शुरू किए गए मौजूदा इंडेक्सिंग ऑपरेशन को रोकते हैं। हालांकि, जब आप resumable=ON . के साथ पुनर्निर्माण आदेश के लिए पिछले सत्र में वापस जाते हैं , यह एक बदसूरत त्रुटि देता है। उह। लेकिन हाँ, यह अपेक्षित व्यवहार है।
इस पुन:प्रारंभ करने योग्य अनुक्रमणिका के पुनर्निर्माण के साथ, SQL सर्वर ने एक नया DMV sys.index_resumable_operations भी पेश किया रुके हुए कार्यों की जांच के लिए। आइए इस DMV को देखने का प्रयास करें:
DMV परिणाम क्वेरी मेरी अनुक्रमणिका पुनर्निर्माण कमांड लौटाती है, पूर्ण किया गया प्रतिशत बहुत अच्छी बात है, और बहुत कुछ। जब आपके सभी अनुक्रमणिका पुनर्निर्माण कार्य पूर्ण हो जाते हैं, तो DMV खाली हो जाता है:
बहुत साफ-सुथरा, हुह?
लेकिन क्या होगा अगर आप टेबल के बारे में अपना विचार बदल दें? क्या होगा यदि आवश्यकताओं में कोई परिवर्तन हो, और आपको डेटाबेस डिज़ाइन में परिवर्तन करने की आवश्यकता हो? आइए तालिका को छोड़ने का प्रयास करें:
यह एक और बदसूरत, लंबा त्रुटि संदेश देगा:
संदेश 10637, स्तर 16, राज्य 1, पंक्ति 1
इस ऑपरेशन को 'ऑब्जेक्ट' पर आईडी 581577110 के साथ नहीं कर सकता क्योंकि एक या अधिक इंडेक्स वर्तमान में रिज्यूमेबल इंडेक्स पुनर्निर्माण स्थिति में हैं। अधिक जानकारी के लिए कृपया sys.index_resumable_operations देखें।
कुल निष्पादन समय:00:00:00.018
यहां से, आप महसूस करेंगे कि आपके पास ऑपरेशन को पूरी तरह से बंद करने या फिर से शुरू करने और पुनर्निर्माण को पूरा करने के अलावा कोई विकल्प नहीं है।
ऑपरेशन को फिर से शुरू करने या रद्द करने के लिए टी-एसक्यूएल कमांड देखें। तब आप तालिका को सफलतापूर्वक छोड़ सकते हैं:
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] RESUME
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] ABORT
वही त्रुटि तब भी आएगी जब आपको अन्य ऑपरेशन करने की आवश्यकता होगी जैसे कि इंडेक्स को पूरी तरह से छोड़ दें या वर्तमान सत्र को समाप्त कर दें।
लेकिन आप खुद से पूछें, क्या पहली बार में फिर से शुरू करने योग्य विकल्प है? जवाब न है। SQL 2019 के लिए, सभी अनुक्रमणिका निर्माण डिफ़ॉल्ट रूप से RESUMABLE=ON के साथ है। यह इन 2 स्कोप स्टेटमेंट्स के कारण है:
ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_ONLINE=WHEN_SUPPORTED ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_RESUMABLE=WHEN_SUPPORTED
सारांश
प्रदर्शन पर फिर से शुरू करने योग्य विकल्प का उपयोग करने का प्रभाव सामान्य रीइंडेक्स ऑपरेशन का उपयोग करने से अलग नहीं है। SQL सर्वर आपको अपने डेटाबेस रखरखाव कार्यों पर अधिक नियंत्रण देता है।
जहां तक आपकी आवर्त सारणी अनुक्रमणिका पुनर्निर्माण आवश्यकताओं की बात है, तो न्यूनतम व्यावसायिक प्रभाव सुनिश्चित करने के लिए सबसे अच्छा अभ्यास अभी भी अनुक्रमणिका संचालन ऑफ़लाइन या कम से कम व्यस्त समय के दौरान चल रहा है।