खोज…


परिचय

अनुक्रमित एक डेटा संरचना है जिसमें एक विशिष्ट क्रम में व्यवस्थित तालिका की सामग्री के लिए संकेत होते हैं, ताकि डेटाबेस को प्रश्नों का अनुकूलन करने में मदद मिल सके। वे पुस्तक के सूचकांक के समान हैं, जहाँ पृष्ठ (तालिका की पंक्तियाँ) को उनके पृष्ठ संख्या द्वारा अनुक्रमित किया जाता है।

कई प्रकार के सूचकांक मौजूद हैं, और एक मेज पर बनाया जा सकता है। जब कोई क्वेरी के WHERE क्लॉज, JOIN क्लॉज, या ORDER BY क्लॉज में उपयोग किए गए कॉलम पर कोई इंडेक्स मौजूद होता है, तो यह क्वेरी परफॉर्मेंस में काफी सुधार कर सकता है।

टिप्पणियों

अनुक्रमणिका एक स्तंभ के अनुसार तालिका की पंक्तियों को छाँटकर पढ़े गए प्रश्नों को गति देने का एक तरीका है।

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

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

एक सूचकांक बनाना

CREATE INDEX ix_cars_employee_id ON Cars (EmployeeId);

इस तालिका में कार में स्तंभ EmployeeID के लिए एक सूचकांक पैदा करेगा। यह इंडेक्स एम्प्लोयी में मानों के आधार पर सर्वर को सॉर्ट करने या चुनने के लिए प्रश्नों की गति में सुधार करेगा, जैसे कि निम्नलिखित:

SELECT * FROM Cars WHERE EmployeeId = 1

सूचकांक में 1 से अधिक कॉलम हो सकते हैं, जैसा कि निम्नलिखित में है;

CREATE INDEX ix_cars_e_c_o_ids ON Cars (EmployeeId, CarId, OwnerId);

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

उदाहरण के लिए, निम्नलिखित मामले दूसरे सूचकांक का उपयोग करेंगे;

SELECT * FROM Cars WHERE EmployeeId = 1 Order by CarId DESC

यदि आदेश भिन्न होता है, हालांकि, सूचकांक में समान फायदे नहीं हैं, जैसा कि निम्नलिखित में है;

SELECT * FROM Cars WHERE OwnerId = 17 Order by CarId DESC

इंडेक्स उतना उपयोगी नहीं है क्योंकि डेटाबेस को पूरे इंडेक्स को EmployeeId और CarID के सभी मानों में पुनः प्राप्त करना होगा, ताकि यह पता चल सके कि किन मदों में OwnerId = 17

(सूचकांक अभी भी इस्तेमाल किया जा सकता है; यह ऐसा मामला हो सकता है कि क्वेरी ऑप्टिमाइज़र को पता चलता है कि सूचकांक को पुनः प्राप्त करना और OwnerId पर फ़िल्टर करना है, फिर केवल आवश्यक पंक्तियों को पुनर्प्राप्त करना पूर्ण तालिका प्राप्त करने की तुलना में तेज़ है, खासकर यदि तालिका बड़ी है।)

क्लस्टर किए गए, अद्वितीय और सॉर्ट किए गए अनुक्रमित

इंडेक्स में कई विशेषताएं हो सकती हैं जो या तो निर्माण पर, या मौजूदा इंडेक्स को बदलकर सेट की जा सकती हैं।

CREATE CLUSTERED INDEX ix_clust_employee_id ON Employees(EmployeeId, Email);  

उपरोक्त SQL कथन कर्मचारियों पर एक नया क्लस्टर इंडेक्स बनाता है। गुच्छित अनुक्रमित सूचकांक हैं जो तालिका की वास्तविक संरचना को निर्देशित करते हैं; तालिका स्वयं ही सूचकांक की संरचना से मेल खाती है। इसका मतलब है कि एक मेज पर अधिकांश एक संकुल सूचकांक हो सकता है। यदि एक क्लस्टर इंडेक्स पहले से ही टेबल पर मौजूद है, तो उपरोक्त कथन विफल हो जाएगा। (बिना क्लस्टर इंडेक्स वाले टेबल्स को ढेर भी कहा जाता है।)

CREATE UNIQUE INDEX uq_customers_email ON Customers(Email);

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

CREATE UNIQUE INDEX ix_eid_desc ON Customers(EmployeeID);

यह ग्राहकों पर एक सूचकांक बनाता है जो एक तालिका बाधा भी बनाता है कि कर्मचारी को अद्वितीय होना चाहिए। (यह विफल हो जाएगा यदि स्तंभ वर्तमान में अद्वितीय नहीं है - इस मामले में, अगर कोई कर्मचारी हैं जो एक आईडी साझा करते हैं।)

CREATE INDEX ix_eid_desc ON Customers(EmployeeID Desc);

यह एक सूचकांक बनाता है जो अवरोही क्रम में क्रमबद्ध होता है। डिफ़ॉल्ट रूप से, अनुक्रमित (MSSQL सर्वर में, कम से कम) आरोही हैं, लेकिन इसे बदला जा सकता है।

एक अद्वितीय सूचकांक के साथ सम्मिलित करना

UPDATE Customers SET Email = "[email protected]" WHERE id = 1;

यह विफल हो जाएगा यदि एक अद्वितीय सूचकांक ग्राहकों के ईमेल स्तंभ पर सेट किया गया है। हालाँकि, इस मामले के लिए वैकल्पिक व्यवहार को परिभाषित किया जा सकता है:

UPDATE Customers SET Email = "[email protected]" WHERE id = 1 ON DUPLICATE KEY; 

SAP ASE: ड्रॉप इंडेक्स

यह कमांड तालिका में सूचकांक को गिरा देगा। यह SAP ASE सर्वर पर काम करता है।

वाक्य - विन्यास:

DROP INDEX [table name].[index name]

उदाहरण:

DROP INDEX Cars.index_1

अनुक्रमित अनुक्रमित

यदि आप किसी ऐसे इंडेक्स का उपयोग करते हैं जो आपके द्वारा प्राप्त किए जाने के तरीके को क्रमबद्ध करता है, तो SELECT स्टेटमेंट में SELECT स्टेटमेंट अतिरिक्त सॉर्टिंग नहीं करेगा।

CREATE INDEX ix_scoreboard_score ON scoreboard (score DESC);

जब आप क्वेरी निष्पादित करते हैं

SELECT * FROM scoreboard ORDER BY score DESC;

डेटाबेस सिस्टम अतिरिक्त सॉर्टिंग नहीं करेगा, क्योंकि यह उस क्रम में एक इंडेक्स-लुकअप कर सकता है।

किसी इंडेक्स को छोड़ना, या उसे डिसएबल करना और उसका पुनर्निर्माण करना

DROP INDEX ix_cars_employee_id ON Cars;  

हम अपने सूचकांक को हटाने के लिए कमांड DROP का उपयोग कर सकते हैं। इस उदाहरण में हम टेबल कार पर ix_cars_employee_id नामक सूचकांक को DROP करेंगे।

यह पूरी तरह से सूचकांक को हटा देता है, और यदि सूचकांक को क्लस्टर किया जाता है, तो किसी भी क्लस्टरिंग को हटा देगा। इसे इंडेक्स को फिर से बनाए बिना नहीं बनाया जा सकता है, जो धीमा और कम्प्यूटेशनल रूप से महंगा हो सकता है। एक विकल्प के रूप में, सूचकांक को निष्क्रिय किया जा सकता है:

ALTER INDEX ix_cars_employee_id ON Cars DISABLE; 

यह तालिका को सूचकांक के बारे में मेटाडेटा के साथ संरचना को बनाए रखने की अनुमति देता है।

आलोचनात्मक रूप से, यह सूचकांक के आंकड़ों को बनाए रखता है, ताकि परिवर्तन का आसानी से मूल्यांकन करना संभव हो। यदि वारंट किया गया है, तो बाद में पूरी तरह से फिर से बनाए जाने के बजाय सूचकांक को बाद में फिर से बनाया जा सकता है;

ALTER INDEX ix_cars_employee_id ON Cars REBUILD;

अद्वितीय सूचकांक जो NULLS को अनुमति देता है

CREATE UNIQUE INDEX idx_license_id 
   ON Person(DrivingLicenseID) WHERE DrivingLicenseID IS NOT NULL
GO

यह स्कीमा 0..1 संबंध के लिए अनुमति देता है - लोगों के पास शून्य या एक ड्राइविंग लाइसेंस हो सकता है और प्रत्येक लाइसेंस केवल एक व्यक्ति का हो सकता है

सूचकांक का पुनर्निर्माण करें

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

हम फिर से एक इंडेक्स बना सकते हैं

ALTER INDEX index_name REBUILD; 

डिफ़ॉल्ट रूप से पुनर्निर्माण सूचकांक ऑफ़लाइन ऑपरेशन है जो तालिका को लॉक करता है और इसके खिलाफ डीएमएल को रोकता है, लेकिन कई आरडीबीएमएस ऑनलाइन पुनर्निर्माण की अनुमति देते हैं। इसके अलावा, कुछ डीबी वेंडर अनुक्रमणिका पुनर्निर्माण के विकल्प प्रदान करते हैं जैसे कि REORGANIZE (SQLServer) या COALESCE / SHRINK SPACE (Oracle)।

गुच्छेदार सूचकांक

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

आम तौर पर, बड़े डेटा तालिकाओं पर रीड्स का प्रदर्शन करते समय क्लस्टर किए गए सूचकांक का उपयोग करना सबसे अच्छा होता है। क्लस्टर किए गए सूचकांक का डोनसाइड तब होता है जब टेबल पर लिखना होता है और डेटा को पुनर्गठित (रिसोर्ट) करना होता है।

स्तंभ पर एक अनुक्रमित क्लस्टर बनाने का एक उदाहरण Employee_Surname स्तंभ पर कर्मचारी:

CREATE CLUSTERED INDEX ix_employees_name ON Employees(Employee_Surname);  

गैर संकुल सूचकांक

गैर-अनुक्रमित अनुक्रमित तालिका से अलग से संग्रहीत किए जाते हैं। इस संरचना के प्रत्येक सूचकांक में तालिका में पंक्ति के लिए एक सूचक होता है जो इसे दर्शाता है।

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

टेबल कर्मचारियों और स्तंभ कर्मचारी पर एक गैर-संकुल सूचकांक बनाने का एक उदाहरण कर्मचारी:

CREATE NONCLUSTERED INDEX ix_employees_name ON Employees(Employee_Surname);  

मेज पर कई गैर-अनुक्रमित अनुक्रमित हो सकते हैं। रीड ऑपरेशंस आमतौर पर क्लस्टर किए गए इंडेक्स की तुलना में नॉन क्लस्टर्ड इंडेक्स के साथ धीमे होते हैं क्योंकि आपको पहले इंडेक्स में जाना होता है और टेबल की तुलना में। हालांकि लेखन कार्यों में कोई प्रतिबंध नहीं है।

आंशिक या फ़िल्टर्ड सूचकांक

SQL सर्वर और SQLite अनुक्रमणिका बनाने की अनुमति देते हैं जिसमें न केवल स्तंभों का सबसेट होता है, बल्कि पंक्तियों का सबसेट भी होता है।

समाप्त (2) के बराबर order_state_id साथ ऑर्डर की निरंतर बढ़ती मात्रा पर विचार करें, और ऑर्डर के साथ ऑर्डर की स्थिर order_state_id equal शुरू order_state_id equal (1)।

यदि आपका व्यवसाय इस तरह से प्रश्नों का उपयोग करता है:

SELECT id, comment
  FROM orders
 WHERE order_state_id =  1
   AND product_id = @some_value;

आंशिक अनुक्रमण आपको केवल अधूरे आदेश सहित सूचकांक को सीमित करने की अनुमति देता है:

CREATE INDEX Started_Orders
          ON orders(product_id)
       WHERE order_state_id = 1;

यह इंडेक्स अनफ़िल्टर्ड इंडेक्स से छोटा होगा, जो स्पेस बचाता है और इंडेक्स को अपडेट करने की लागत को कम करता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow