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

SQL सर्वर में क्लस्टर्ड या नॉन-क्लस्टर इंडेक्स का उपयोग कब करें

डेटाबेस इंडेक्स का उपयोग बड़ी संख्या में रिकॉर्ड वाली तालिका में डेटाबेस संचालन की गति को बेहतर बनाने के लिए किया जाता है। डेटाबेस इंडेक्स (क्लस्टर इंडेक्स और नॉन-क्लस्टर इंडेक्स दोनों) उनकी कार्यक्षमता में बुक इंडेक्स के समान हैं। एक पुस्तक अनुक्रमणिका आपको पुस्तक में चर्चा किए गए विभिन्न विषयों पर सीधे जाने की अनुमति देती है। यदि आप किसी विशिष्ट विषय की खोज करना चाहते हैं, तो आप केवल अनुक्रमणिका पर जाएं, उस पृष्ठ संख्या को खोजें जिसमें वह विषय है जिसे आप ढूंढ रहे हैं और फिर सीधे उस पृष्ठ पर जा सकते हैं। सूचकांक के बिना, आपको पूरी किताब खोजनी होगी।

डेटाबेस इंडेक्स उसी तरह काम करते हैं। इंडेक्स के बिना आपको एक विशिष्ट डेटाबेस ऑपरेशन करने के लिए पूरी तालिका को खोजना होगा। इंडेक्स के साथ, आपको सभी टेबल रिकॉर्ड्स को स्कैन करने की आवश्यकता नहीं है। अनुक्रमणिका आपको सीधे उस रिकॉर्ड की ओर इंगित करती है जिसे आप खोज रहे हैं, जो आपके क्वेरी निष्पादन समय को महत्वपूर्ण रूप से कम करता है।

SQL सर्वर इंडेक्स को दो मुख्य प्रकारों में विभाजित किया जा सकता है:

  1. संकुल अनुक्रमणिका
  2. गैर-संकुल अनुक्रमणिका

इस लेख में, हम देखेंगे कि संकुल और गैर-संकुल सूचकांक क्या हैं, वे कैसे बनाए जाते हैं और दोनों के बीच मुख्य अंतर क्या हैं। हम यह भी देखेंगे कि SQL सर्वर में क्लस्टर्ड या नॉन-क्लस्टर इंडेक्स का उपयोग कब करना है।

आइए सबसे पहले एक संकुल अनुक्रमणिका से शुरुआत करें।

संकुल अनुक्रमणिका

एक संकुल सूचकांक एक सूचकांक है जो भौतिक क्रम को परिभाषित करता है जिसमें तालिका रिकॉर्ड डेटाबेस में संग्रहीत होते हैं। चूंकि डेटाबेस तालिका में रिकॉर्ड को भौतिक रूप से संग्रहीत करने का केवल एक ही तरीका हो सकता है, प्रति तालिका केवल एक क्लस्टर इंडेक्स हो सकता है। डिफ़ॉल्ट रूप से प्राथमिक कुंजी कॉलम पर क्लस्टर इंडेक्स बनाया जाता है।

डिफ़ॉल्ट क्लस्टर इंडेक्स

आइए डिफ़ॉल्ट क्लस्टर इंडेक्स देखने के लिए प्राथमिक कुंजी कॉलम के साथ एक डमी टेबल बनाएं। निम्न स्क्रिप्ट निष्पादित करें:

CREATE DATABASE Hospital

CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)

उपरोक्त स्क्रिप्ट एक डमी डेटाबेस अस्पताल बनाती है। डेटाबेस में 4 कॉलम हैं:आईडी, नाम, लिंग, आयु। आईडी कॉलम प्राथमिक कुंजी कॉलम है। जब उपरोक्त स्क्रिप्ट निष्पादित की जाती है, तो आईडी कॉलम पर एक क्लस्टर इंडेक्स स्वचालित रूप से बनाया जाता है। किसी तालिका में सभी अनुक्रमणिका देखने के लिए, आप "sp_helpindex" संग्रहीत कार्यविधि का उपयोग कर सकते हैं।

USE Hospital
EXECUTE sp_helpindex Patients

यहाँ आउटपुट है:

आप इंडेक्स का नाम, विवरण और उस कॉलम को देख सकते हैं जिस पर इंडेक्स बनाया गया है। यदि आप रोगी तालिका में एक नया रिकॉर्ड जोड़ते हैं, तो इसे आईडी कॉलम में मान के आरोही क्रम में संग्रहीत किया जाएगा। यदि आपके द्वारा तालिका में डाला गया पहला रिकॉर्ड तीन की एक आईडी है, तो रिकॉर्ड पहली पंक्ति के बजाय तीसरी पंक्ति में संग्रहीत किया जाएगा क्योंकि क्लस्टर इंडेक्स भौतिक क्रम बनाए रखता है।

कस्टम क्लस्टर इंडेक्स

आप अपनी खुद की संकुल अनुक्रमणिका बना सकते हैं। हालांकि, इससे पहले कि आप ऐसा कर सकें, आपको मौजूदा क्लस्टर इंडेक्स बनाना होगा। प्राथमिक कुंजी कॉलम के कारण हमारे पास एक क्लस्टर इंडेक्स है। यदि हम प्राथमिक कुंजी बाधा को हटाते हैं, तो डिफ़ॉल्ट क्लस्टर हटा दिया जाएगा। निम्न स्क्रिप्ट प्राथमिक कुंजी बाधा को हटाती है।

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO

निम्न स्क्रिप्ट रोगी तालिका के आयु स्तंभ पर एक कस्टम अनुक्रमणिका "IX_tblPatient_Age" बनाती है। इस सूचकांक के कारण, रोगी तालिका में सभी अभिलेख आयु के आरोही क्रम में संग्रहीत किए जाएंगे।


use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)

आइए अब यह देखने के लिए कि क्या वे वास्तव में उम्र के बढ़ते क्रम में डाले गए हैं, मरीजों की तालिका में कुछ डमी रिकॉर्ड जोड़ें:

USE Hospital

INSERT INTO Patients

VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)

उपरोक्त लिपि में, हम 5 डमी रिकॉर्ड जोड़ते हैं। आयु कॉलम के मानों पर ध्यान दें। उनके पास यादृच्छिक मान हैं और किसी भी तार्किक क्रम में नहीं हैं। हालांकि, चूंकि हमने एक क्लस्टर इंडेक्स बनाया है, इसलिए रिकॉर्ड वास्तव में आयु कॉलम में मूल्य के आरोही क्रम में डाले जाएंगे। आप रोगी तालिका से सभी अभिलेखों का चयन करके इसे सत्यापित कर सकते हैं।

SELECT * FROM Patients

यहाँ आउटपुट है:

आप देख सकते हैं कि आयु स्तंभ में मानों के आरोही क्रम में अभिलेखों को क्रमबद्ध किया गया है।

गैर-संकुल अनुक्रमणिका

खोज कार्यों में तेजी लाने के लिए एक गैर-संकुल सूचकांक का भी उपयोग किया जाता है। एक संकुल सूचकांक के विपरीत, एक गैर-संकुल सूचकांक भौतिक रूप से उस क्रम को परिभाषित नहीं करता है जिसमें रिकॉर्ड एक तालिका में डाले जाते हैं। वास्तव में, एक गैर-संकुल सूचकांक को डेटा तालिका से अलग स्थान पर संग्रहीत किया जाता है। एक गैर-संकुल सूचकांक एक पुस्तक सूचकांक की तरह होता है, जो पुस्तक की मुख्य सामग्री से अलग स्थित होता है। चूंकि गैर-संकुल सूचकांक एक अलग स्थान पर स्थित होते हैं, इसलिए प्रति तालिका में कई गैर-संकुल सूचकांक हो सकते हैं।

एक गैर-संकुल सूचकांक बनाने के लिए, आपको "गैर-संकुल बनाएं" कथन का उपयोग करना होगा। बाकी सिंटैक्स क्लस्टर इंडेक्स बनाने के लिए सिंटैक्स के समान ही रहता है। निम्न स्क्रिप्ट एक गैर-संकुल अनुक्रमणिका "IX_tblPatient_Name" बनाती है जो रिकॉर्ड को नाम के आरोही क्रम में क्रमबद्ध करती है।

use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)

उपरोक्त स्क्रिप्ट एक इंडेक्स बनाएगी जिसमें रोगियों के नाम और उनके संबंधित रिकॉर्ड का पता होगा जैसा कि नीचे दिखाया गया है:

नाम पता रिकॉर्ड करें
एना रिकॉर्ड पता
जॉन रिकॉर्ड पता
माइक रिकॉर्ड पता
निक रिकॉर्ड पता
सारा रिकॉर्ड पता

यहां, प्रत्येक पंक्ति में "रिकॉर्ड पता" संबंधित नाम वाले मरीजों के लिए वास्तविक तालिका रिकॉर्ड का संदर्भ है।

उदाहरण के लिए, यदि आप "माइक" नामक रोगी की आयु और लिंग को पुनः प्राप्त करना चाहते हैं, तो डेटाबेस पहले गैर-क्लस्टर इंडेक्स "IX_tblPatient_Name" में "मिक" खोजेगा और गैर-क्लस्टर इंडेक्स से यह वास्तविक रिकॉर्ड संदर्भ प्राप्त करेगा। और इसका उपयोग "माइक" नामक रोगी की वास्तविक आयु और लिंग को वापस करने के लिए करेगा

चूंकि एक डेटाबेस को दो खोज करनी होती है, पहले गैर-संकुल अनुक्रमणिका में और फिर वास्तविक तालिका में, गैर-संकुल अनुक्रमणिका खोज कार्यों के लिए धीमी हो सकती है। हालाँकि, INSERT और UPDATE संचालन के लिए, गैर-संकुल अनुक्रमणिकाएँ तेज़ होती हैं क्योंकि अभिलेखों के क्रम को केवल अनुक्रमणिका में अद्यतन करने की आवश्यकता होती है, वास्तविक तालिका में नहीं।

क्लस्टर या नॉन-क्लस्टर इंडेक्स का उपयोग कब करें

अब जब आप क्लस्टर्ड और नॉन-क्लस्टर इंडेक्स के बीच अंतर जानते हैं, तो आइए उनमें से प्रत्येक का उपयोग करने के लिए अलग-अलग परिदृश्य देखें।

<एच3>1. अनुक्रमणिका की संख्या

यह काफी स्पष्ट है। यदि आपको अपने डेटाबेस पर एकाधिक अनुक्रमणिका बनाने की आवश्यकता है, तो गैर-संकुल अनुक्रमणिका के लिए जाएं क्योंकि केवल एक संकुल अनुक्रमणिका हो सकती है।

<एच3>2. संचालन चुनें

यदि आप केवल अनुक्रमणिका मान का चयन करना चाहते हैं जो बनाने और अनुक्रमणिका के लिए उपयोग किया जाता है, तो गैर-संकुल अनुक्रमणिकाएँ तेज़ होती हैं। उदाहरण के लिए, यदि आपने "नाम" कॉलम पर एक इंडेक्स बनाया है और आप केवल नाम का चयन करना चाहते हैं, तो गैर-क्लस्टर इंडेक्स जल्दी से नाम वापस कर देंगे।

हालांकि, यदि आप नाम इंडेक्स का उपयोग करके अन्य कॉलम मानों जैसे आयु, लिंग का चयन करना चाहते हैं, तो चयन ऑपरेशन धीमा हो जाएगा क्योंकि पहले नाम इंडेक्स से खोजा जाएगा और फिर वास्तविक तालिका रिकॉर्ड के संदर्भ का उपयोग खोज के लिए किया जाएगा उम्र और लिंग।

दूसरी ओर, क्लस्टर इंडेक्स के साथ, क्योंकि सभी रिकॉर्ड पहले से ही सॉर्ट किए गए हैं, यदि क्लस्टर इंडेक्स वाले कॉलम के अलावा अन्य कॉलम से डेटा का चयन किया जा रहा है, तो सेलेक्ट ऑपरेशन तेज है।

<एच3>3. INSERT/अद्यतन संचालन

INSERT और UPDATE ऑपरेशंस नॉन-क्लस्टर इंडेक्स के साथ तेज होते हैं क्योंकि INSERT या UPDATE ऑपरेशन किए जाने पर वास्तविक रिकॉर्ड को सॉर्ट करने की आवश्यकता नहीं होती है। बल्कि केवल गैर-संकुल सूचकांक को अद्यतन करने की आवश्यकता है।

<एच3>4. डिस्क स्थान

चूंकि, गैर-संकुल अनुक्रमणिका मूल तालिका की तुलना में एक अलग स्थान पर संग्रहीत हैं, गैर-संकुल अनुक्रमणिका अतिरिक्त डिस्क स्थान का उपभोग करती हैं। यदि डिस्क स्थान एक समस्या है, तो संकुल अनुक्रमणिका का उपयोग करें।

5. अंतिम फैसला

एक नियम के रूप में, प्रत्येक तालिका में कम से कम एक क्लस्टर इंडेक्स होना चाहिए, अधिमानतः कॉलम पर जो रिकॉर्ड्स का चयन करने के लिए उपयोग किया जाता है और इसमें अद्वितीय मान होते हैं। प्राथमिक कुंजी कॉलम क्लस्टर इंडेक्स के लिए एक आदर्श उम्मीदवार है।

दूसरी ओर जो कॉलम अक्सर INSERT और UPDATE प्रश्नों में शामिल होते हैं, उनमें एक गैर-संकुल सूचकांक होना चाहिए, यह मानते हुए कि डिस्क स्थान कोई चिंता का विषय नहीं है।


  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 सर्वर प्रबंधन स्टूडियो 2008 में जेनरेट स्क्रिप्ट कार्य को स्वचालित कैसे कर सकता हूं?

  2. मैं सबसे महंगी क्वेरी कैसे लॉग और ढूँढ सकता हूँ?

  3. Ubuntu पर sqlcmd और bcp कैसे स्थापित करें?

  4. varbinary डेटा को डिस्क में सहेजने के लिए स्क्रिप्ट

  5. SQL सर्वर में डेटाबेस में सभी तालिकाओं के लिए कॉलम विवरण जोड़ें कैसे उत्पन्न करें - SQL सर्वर / टी-एसक्यूएल ट्यूटोरियल भाग 49