2008-10-21 7 views
13

जब एक स्तंभ है कि अद्वितीय (लेकिन तालिका के प्राथमिक कुंजी), होना करने के लिए एसक्यूएल सर्वर आइए मुझे कुछ विकल्पों का चयन जा रहा है पर एक सूचकांक बनाने:SQL सर्वर में "अनुक्रमणिका" या "बाधा" के रूप में UNIQUE अनुक्रमणिका बनाने के बीच क्या अंतर है?

1) मैं इसे एक बाधा होने के लिए चुन सकते हैं या एक सूचकांक।
मुझे लगता है कि इसका मतलब यह है कि यदि मैं इसे बाधा के रूप में सेट करता हूं, तो यह पूछताछ करते समय इसका उपयोग नहीं करेगा, केवल लिखते समय। हालांकि, एकमात्र कुशल तरीका मैं SQL सर्वर के लिए उस बाधा को लागू करने के लिए सोच सकता हूं वास्तव में एक सूचकांक बना रहा है। इस विकल्प के लिए उपयोग क्या है?

2) इसके अलावा, अगर मैं इसे "इंडेक्स" के रूप में सेट करता हूं, तो यह मुझे निर्दिष्ट करता है कि इसे डुप्लिकेट कुंजी को अनदेखा करना चाहिए। यह मेरे लिए सबसे परेशान है ...
मुझे लगता है कि इसका मतलब बाधा के विपरीत है। इसका शायद अर्थ है "पूछताछ करते समय इसका इस्तेमाल करें, लेकिन लिखते समय भी जांच न करें"।
लेकिन फिर मैं इसे अद्वितीय के रूप में क्यों सेट करूंगा?
मुझे लगता है कि एसक्यूएल सर्वर कुछ अनुकूलन कर सकता है, लेकिन मैं इसे बेहतर समझना चाहता हूं।

क्या किसी को पता है कि इन विकल्पों के साथ वास्तव में SQL सर्वर क्या करता है?
इंडेक्स को अद्वितीय बनाने के लिए उपयोग केस क्या है, लेकिन डुप्लिकेट कुंजी को अनदेखा करें?

नोट: यह एसक्यूएल सर्वर के लिए है 2000


संपादित करें: के अनुसार जो आपने कहा है, हालांकि ... अगर मैं एक बाधा बना सकते हैं, यह उन क्वेरी के लिए फिल्टर का उपयोग कर तेजी लाने के लिए उपयोग किया जाएगा बाधा में खेतों?

धन्यवाद!

+0

मैंने हमेशा इस अंतर के बारे में सोचा है। एक अद्वितीय सूचकांक और एक अद्वितीय बाधा के बीच का अंतर। – leppie

उत्तर

7

UNIQUE बाधा आईएसओ/एएनएसआई एसक्यूएल मानक का हिस्सा है, जबकि इंडेक्स इसलिए नहीं हैं क्योंकि मानक कार्यान्वयन अज्ञेयवादी है। अधिकांश SQL DBMSs के साथ सामान्य रूप से SQL सर्वर, UNIQUE बाधा को लागू करने के लिए एक अनुक्रमणिका का उपयोग करेगा।

बेशक, UNIQUE का इस्तेमाल करके उनकी एक SQL स्क्रिप्ट में सूचकांक की तुलना में है थोड़ा अधिक पोर्टेबल लेकिन हमेशा की तरह मालिकाना वाक्य रचना की संभावना से इनकार नहीं किया जाना चाहिए अगर यह अनुकूलन आदि के लिए अवसरों के provids

5

SQL सर्वर अद्वितीय बाधाओं को लागू करने के लिए एक अनुक्रमणिका तैयार करेगा। आप sys.key_constraints व्यू में अद्वितीय बाधाओं को लागू करने के लिए उपयोग की जाने वाली अद्वितीय अनुक्रमणिका का संदर्भ देख सकते हैं (2005 — क्षमा करें, मुझे 2000 समकक्ष नहीं पता)। लेकिन पूछताछ करते समय दोनों संस्करण इंडेक्स का उपयोग करेंगे।

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

दोनों विकल्प आपको मौजूदा डेटा पर "डुप्लिकेट चाबी उपेक्षा" करने की अनुमति देगा, लेकिन अगर आप एक नई मूल्य है कि पहले से मौजूद किसी डुप्लिकेट सम्मिलित करने का प्रयास दोनों एक त्रुटि बढ़ा देंगे।

2

इस तथ्य के अलावा अद्वितीय बाधा और एक अद्वितीय अनुक्रमणिका के बीच कोई व्यावहारिक अंतर नहीं है कि अद्वितीय बाधा डेटाबेस में एक बाधा वस्तु के रूप में भी सूचीबद्ध है।

+0

कुछ लाभ है हालांकि किसी अद्वितीय इंडेक्स की बजाय एक अद्वितीय कुंजी के रूप में चिह्नित करने के लिए, ओआरएम जैसे डेटाबेस टूल्स में अद्वितीय कुंजी दिखाई देगी, और उनका लाभ उठा सकता है। अनन्य कुंजी लगभग हमेशा न्यूनतम होती हैं, और इस प्रकार "उम्मीदवार कुंजी" होती है, जबकि अद्वितीय इंडेक्स नियमित रूप से (perfomance बढ़ते) इंडेक्स को चिह्नित कर सकते हैं क्योंकि वे एक अद्वितीय कुंजी के सभी कॉलम (उन्हें "सुपर कुंजियां" बनाना) शामिल करते हैं, और चिह्नित करके अद्वितीय SQL सर्वर के रूप में अनुक्रमणिका क्वेरी अनुकूलन में उस तथ्य का लाभ उठा सकती है। –

+0

केविन: एक अनूठी कुंजी या तो प्राथमिक कुंजी या एक अद्वितीय बाधा है। एसक्यूएल एसक्यूएल सर्वर में अद्वितीय बाधाओं को एक इंडेक्स का उपयोग करके कार्यान्वित किया जाता है। डोमेन वर्णन करता है कि क्या कुछ अद्वितीय होना चाहिए, प्रदर्शन के लिए अपरिवर्तित (यह केवल एक दुष्प्रभाव है) –

+0

दरअसल, मेरा कहना है कि हर जगह अद्वितीय बाधा "मैं अनन्य कुंजी" थी। मेरी पोस्ट अर्थपूर्ण अंतर को इंगित करने के लिए थी, भले ही SQL सर्वर उन्हें समान रूप से व्यवहार करता हो। एसक्यूएल सर्वर का एक भविष्य संस्करण संभावित रूप से किसी अन्य तरीके से अद्वितीय बाधाओं को कार्यान्वित कर सकता है जो कोई लुकअप लाभ प्रदान नहीं कर सकता है, इसलिए यदि लक्ष्य लक्ष्य है (अंगूठे के नियम के रूप में ये "सुपरकीज़" हैं) और एक वास्तविक अद्वितीय इंडेक्स का उपयोग करना सबसे अच्छा है। अद्वितीय कॉन्स्टेंट यदि लक्ष्य डेटा अभिन्नता है (आमतौर पर "उम्मीदवार कुंजी" पर लागू होता है, क्योंकि कुछ और अपर्याप्त है)। –

2

एमएसडीएन के मुताबिक, एक अद्वितीय बाधा के माध्यम से एक अद्वितीय इंडेक्स बनाने, या स्पष्ट रूप से CREATE UNIQUE INDEX कथन का उपयोग करके बनाने में कोई महत्वपूर्ण अंतर नहीं है। दोनों मामलों में, डेटा को समानता के लिए मान्य किया जाता है, और क्वेरी ऑप्टिमाइज़र भी उनके साथ किसी भी तरह से इलाज नहीं करता है। अच्छी प्रैक्टिस के रूप में, यदि डेटा अखंडता लक्ष्य है, तो अनन्य बाधा का उपयोग करें, अन्य बुद्धिमान उपयोग सीधे अद्वितीय INDEX कथन बनाएं।

Here एक उत्कृष्ट लेख और एक दृष्टिकोण है जो दोनों दृष्टिकोणों के बीच अंतर को समझाता है।

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

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