लंबी कहानी संक्षिप्त: यदि आपका डेटा आंतरिक रूप से UNIQUE
है, तो आपको UNIQIE
अनुक्रमणिका बनाने से लाभ होगा।
अब, रक्तमय विवरण:
विस्तृत विवरण के लिए अपने ब्लॉग में लेख देखें।
@Mehrdad ने कहा, UNIQUENESS
योजना निर्माता में अनुमानित पंक्ति गणना को प्रभावित करता है। अनुकूलक सोचता है कि अगर non_unique_indexed_field
चयनात्मक नहीं है, जबकि
SELECT *
FROM table1 t2, table2 t2
WHERE t1.id = :myid
AND t2.non_unique_indexed_field = t1.value
एक HASH JOIN
से लाभ हो सकता,
SELECT *
FROM table1 t2, table2 t2
WHERE t1.id = :myid
AND t2.unique_indexed_field = t1.value
लगभग निश्चित रूप से NESTED LOOPS
का उपयोग करेगा:
UNIQUE
सूचकांक अधिक से अधिक संभव चयनात्मकता इसका कारण यही है,।
अपने सूचकांक है CLUSTERED
(i। ई। पंक्तियों theirselves सूचकांक पत्तियों में निहित हैं) और गैर UNIQUE
, तो एक विशेष छिपा स्तंभ कहा जाता uniquifier
प्रत्येक सूचकांक कुंजी में जोड़ा जाता है, इस प्रकार कुंजी बड़ा और सूचकांक धीमी बना रही है।
यही कारण है कि UNIQUE CLUSTERED
सूचकांक वास्तव में non-UNIQUE CLUSTERED
एक से थोड़ा अधिक प्रभावशाली है।
Oracle
में UNIQUE INDEX
पर शामिल होने के लिए key preservation
पर शामिल होना आवश्यक है, जो सुनिश्चित करता है कि तालिका से प्रत्येक पंक्ति का चयन सबसे अधिक बार किया जाएगा और एक दृश्य अद्यतन करने योग्य बनाता है।
इस क्वेरी:
UPDATE (
SELECT *
FROM mytable t1, mytable t2
WHERE t2.reference = t1.unique_indexed_field
)
SET value = other_value
Oracle
में काम करेंगे, जबकि यह एक:
UPDATE (
SELECT *
FROM mytable t1, mytable t2
WHERE t2.reference = t1.non_unique_indexed_field
)
SET value = other_value
असफल हो जायेगी।
यह SQL Server
के साथ कोई समस्या है, हालांकि नहीं है।
एक और बात: इस तरह एक मेज के लिए,
CREATE TABLE t_indexer (id INT NOT NULL PRIMARY KEY, uval INT NOT NULL, ival INT NOT NULL)
CREATE UNIQUE INDEX ux_indexer_ux ON t_indexer (uval)
CREATE INDEX ix_indexer_ux ON t_indexer (ival)
, इस क्वेरी:
/* Sorts on the non-unique index first */
SELECT TOP 1 *
FROM t_indexer
ORDER BY
ival, uval
एक TOP N SORT
का उपयोग करेगा, जबकि यह एक:
/* Sorts on the unique index first */
SELECT TOP 1 *
FROM t_indexer
ORDER BY
uval, ival
केवल एक इंडेक्स स्कैन का उपयोग करेगा।
बाद की क्वेरी के लिए, ival
पर अतिरिक्त सॉर्टिंग में कोई बिंदु नहीं है, क्योंकि uval
वैसे भी अद्वितीय हैं, और अनुकूलक इसे ध्यान में रखता है।
200,000
पंक्तियों (id == uval == ival
) के नमूना डेटा पर, पूर्व क्वेरी 15
सेकेंड के लिए चलती है, जबकि बाद वाला एक तत्काल है।
आपके डेटाबेस में ईमानदारी हमेशा सर्वोपरि महत्व का है। –