2012-04-21 19 views
42

पर अद्वितीय कुंजी बनाम अद्वितीय इंडेक्स मेरे पास countries नामक एक टेबल है और मैं country_name कॉलम को SQL Server 2008 R2 पर "अनन्य कुंजी" प्रकार के "इंडेक्स/कुंजी" बनाकर अद्वितीय होने के लिए परिभाषित करता हूं।एसक्यूएल सर्वर 2008

लेकिन मैं निम्नलिखित प्रश्न हैं:

  1. प्रकार के "सूचकांक/कुंजी" "अद्वितीय कुंजी" बनाने जाएगा स्वचालित रूप से इस स्तंभ पर एक गैर क्लस्टर सूचकांक बनाने?
  2. यदि मैं "अनन्य कुंजी" से "इंडेक्स" होने के प्रकार को बदलता हूं और मैं IsUnique मान को "हां" मानता हूं, तो क्या कोई अंतर होगा?
  3. तो दो विकल्प "अनन्य कुंजी" और "इंडेक्स" क्यों हैं, मुझे लगता है कि दोनों समान हैं?

उत्तर

59

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

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar); 

कुछ लोगों के बजाय एक अद्वितीय सूचकांक बनाने के लिए, उदाहरण के लिए: मैं बस इसे लागू करने के लिए करते हैं

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar); 

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

मुझे लगता है कि पिछले सिबेज कार्यक्षमता दोनों के साथ-साथ एएनएसआई मानक का पालन करने के लिए कई विकल्प हैं (भले ही अद्वितीय बाधाएं मानक 100% का पालन न करें, क्योंकि वे केवल एक नल मान की अनुमति देते हैं - ए दूसरी ओर, अद्वितीय अनुक्रमणिका, SQL Server 2008 और अधिक पर WHERE खंड (WHERE col IS NOT NULL) जोड़कर इसके आसपास काम कर सकती है)।

+0

यह सुनिश्चित नहीं है कि यह केवल जानकारी भिन्नता है, लेकिन 'sys.indexes' में कॉलम 'is_unique_constraint' है, यह बताने के लिए कि क्या इंडेक्स को एक अद्वितीय अनुक्रमणिका के बजाय बाधा के रूप में परिभाषित किया गया है। –

+1

@Andre Yep, यह मेटाडेटा में एक कॉलम है, ताकि एक * उपयोगकर्ता * बता सकता है कि इसे मूल रूप से बाधा के रूप में घोषित किया गया था या नहीं। यह आपको मंशा के बारे में कुछ भी नहीं बताता है, और सूचकांक के भौतिक कार्यान्वयन - और विशिष्टता प्रवर्तन - वही है। –

10

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

CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar 
ON dbo.foo (
    bar 
) 
INCLUDE (foo_other_column) 
GO 

SELECT foo_other_column FROM Foo WHERE bar = 'test' 

एसक्यूएल सर्वर इंडेक्स में "foo_other_column" स्टोर करेगा। अद्वितीय बाधा के मामले में इसे पहले 'टेस्ट' की अनुक्रमणिका मिल जाएगी, फिर फू टेबल में पंक्ति की खोज करेगी और केवल वहां "foo_other_column" लगेगा।

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