2009-04-16 18 views
16

में एक इंडेक्स को अनन्य घोषित करना यदि मुझे पता है कि एक इंडेक्स में अद्वितीय मान होंगे, तो यह इन्सर्ट पर प्रदर्शन को कैसे प्रभावित करेगा या अगर मैं इसे घोषित करता हूं तो इसका चयन कैसे करेगा।एसक्यूएल सर्वर

यदि अनुकूलक जानता है कि सूचकांक अद्वितीय है तो यह क्वेरी योजना को कैसे प्रभावित करेगा?

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

+0

आपके डेटाबेस में ईमानदारी हमेशा सर्वोपरि महत्व का है। –

उत्तर

23

लंबी कहानी संक्षिप्त: यदि आपका डेटा आंतरिक रूप से 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 सेकेंड के लिए चलती है, जबकि बाद वाला एक तत्काल है।

+0

हैश जॉइन और नेस्टेड लूप में शामिल होने के बीच कोई महत्वपूर्ण अंतर है? यह स्पष्ट नहीं है कि आप सुझाव दे रहे हैं कि भेद एक या दूसरे को औचित्य देता है। –

+1

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

+0

क्या आप कह रहे हैं कि कोई सामान्य उत्तर नहीं है (यह क्वेरी पर भारी निर्भर करता है)? क्या इसका कोई आसान जवाब नहीं है ?: अगर सूचकांक * अद्वितीय हो सकता है, तो क्या मुझे इसे अद्वितीय बनाना चाहिए या नहीं? –

4

बेशक ऑप्टिमाइज़र विचार में विशिष्टता लेगा। यह क्वेरी योजनाओं में अपेक्षित पंक्ति गणना को प्रभावित करता है।

0

हां, इसे क्वेरी इंजन द्वारा विचाराधीन माना जाएगा।

0

शायद अधिक महत्वपूर्ण: विशिष्टता डेटा अखंडता की रक्षा करेगी। प्रदर्शन इसे अनदेखा करने का एक कारण होगा।

प्रदर्शन बिल्कुल भी सकारात्मक या नकारात्मक या नहीं प्रभावित हो सकता है: यह होगा क्वेरी पर निर्भर करता है, अगर सूचकांक आदि प्रयोग किया जाता है

1

प्रदर्शन नकारात्मक रूप से प्रभावित कर रहा है जब डेटा डालने। इसे विशिष्टता की जांच करने की आवश्यकता है।

+2

और डेटा का चयन करते समय सकारात्मक रूप से प्रभावित: ऑप्टिमाइज़र विशिष्टता का फायदा उठा सकता है। – kquinn

+6

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

+1

मैं भी इसके बारे में बहुत उत्सुक हूं।बेंचमार्क या विश्वसनीय स्रोतों की बहुत सराहना की जाएगी। –

1

मैं सिर्फ 1 लाख से अधिक पंक्तियों से युक्त है क्योंकि मैं सोचा कि यह एक अच्छा परीक्षण किया गया था एक उत्पादन तालिका के लिए अपने मशीन पर इस परीक्षण किया है। परिणाम दिलचस्प थे, यहां कच्चे संख्या है:

- कोई सूचकांक:

Setup Time: 8888, Insert Time: 501690 

- अद्वितीय बाधा:

Setup Time: 42, Insert Time: 488030 

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

दिलचस्प बात यह है सम्मिलित समय के साथ-साथ थोड़ा सुधार (2.7228% से), इसलिए बाधा (+ निहित इंडेक्स) जोड़ने के केवल सकारात्मक प्रभाव डालता है [अपने परीक्षण मामले में]। कोई प्रदर्शन प्रभाव -

परीक्षण बाधा जोड़ने से केवल सकारात्मक प्रभावों को दर्शाता है।

नोट: हमारे परीक्षण प्रणाली के लिए मैं मानता हूं कि मूल्य हमेशा अनूठे होते हैं, इसलिए मैंने गैर-अद्वितीय मूल्यों को सम्मिलित करने का परीक्षण नहीं किया, इस डेटा में यह वास्तव में एक अपवाद है - और ऐसा कुछ नहीं जिसे हमें प्रदर्शन करने की आवश्यकता है।

संबंधित मुद्दे