प्राथमिक कुंजी के बजाय कवरिंग कॉलम के साथ एक अनूठे गैर-संकुलित सूचकांक का उपयोग करने के निहितार्थ


12

हमारे पास एक बड़ी तालिका है [MyTable]जिसमें वर्तमान में दोनों हैं Primary Key, और एक Unique Non Clustered Indexही कॉलम पर ( [KeyColumn])। यू एनसी इंडेक्स में अतिरिक्त कवरिंग कॉलम भी हैं।

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

ध्यान दें कि तालिका पूरी तरह से किसी अन्य स्तंभ द्वारा क्लस्टर की गई है।

यानी तो हमारे पास है:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO

तथा

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO

जहां तक ​​मुझे पता है, एक प्राथमिक कुंजी में कवरिंग कॉलम जोड़ना संभव नहीं है, इसलिए मैं करना चाहता हूं:

  • पर निर्भर विदेशी कुंजी बाधाओं को छोड़ दें MyTable.KeyColumn
  • प्राथमिक कुंजी को MyTable.KeyColumnपूरी तरह से छोड़ दें
  • तालिका में विदेशी कुंजियों को फिर से जोड़ें (यानी आरआई के माध्यम से लागू किया जाएगा MyTable.KeyColumn)

इसका एकमात्र अर्थ यह है कि मैं ऐसा करने के बारे में सोच सकता हूं कि हमें अपने ईआरडी आरेखों पर दृश्य कुंजी प्रतीक नहीं मिलेगा, और यह भी शामिल है कि (पत्ती) सूचकांक घनत्व शामिल कॉलमों के कारण कम होगा।

मैंने /programming/487314/primary-key-or-unique-index पढ़ा है और यह करने की ईमानदारी और प्रदर्शन पहलुओं से खुश हूं।

मेरा प्रश्न है: क्या यह दृष्टिकोण त्रुटिपूर्ण है?

संपादित करें जो मैं पूरा करने की कोशिश कर रहा हूं : प्रदर्शन अनुकूलन और वसंत सफाई । पीके या एक इंडेक्स को हटाने से, मेरे इंडेक्स के लिए कम पृष्ठों की आवश्यकता होगी = तेजी से लिखता है, साथ ही रखरखाव / परिचालन लाभ, यानी डीफ़्रैग्मेन्ट रखने के लिए एक कम इंडेक्स भी।

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


क्या आप इस बात पर टिप्पणी कर सकते हैं कि आप क्या हासिल करना चाहते हैं? आपको यह भी सुनिश्चित करना चाहिए कि आप अंत में एक क्लस्टर इंडेक्स के साथ समाप्त हो जाएं।

@ jn29098 - अपडेट किया गया। यह पुष्टि करते हुए कि हमारे पास एक क्लस्टर इंडेक्स है, उन कॉलमों पर जो न तो PK हैं और न ही कवरिंग कॉलम हैं, इसलिए यह इस निर्णय के लिए प्रासंगिक नहीं लगता है।
स्टुअर्टएलसी

1
आपको यकीन है कि आपके पास कोई भी उपकरण / ORM / डेटा जनरेशन मॉडलिंग टूल नहीं है जो पीके के चले जाने पर उसे रोक देगा?
रेमस रुसानु

केवल नुकसान मैं देख रहा हूँ कि एक बार पीके चला गया है..तब आपके पास keycolumn पर सिर्फ एक इंडेक्स है और जो क्वेश्चन पीके इंडेक्स का उपयोग कर रहे हैं, जो keycolumns द्वारा keycolumns या इंडेक्स पर इंडेक्स स्कैन के लिए कहते हैं और Uniuqr इंडेक्स द्वारा कवर नहीं होते हैं, कुछ अतिरिक्त IO यूनिक इंडेक्स लीफ पेज पीके की तुलना में बहुत अधिक होते हैं। ठीक है, यह ठीक लगता है। लेकिन कुछ शुद्धतावादी कहेंगे कि आपके पास पीके :) होना चाहिए
गुल्ली मिल

1
मैं आपको सुझाव दूंगा कि आप इंडेक्स यूज़िंग डीएमवी का उपयोग करके उस इंडेक्स की उपयोगिता की जांच करें और देखें कि क्या यह आपके कुछ प्रश्नों द्वारा उपयोग किया जा रहा है। इसे यूनिक की इंड इंडेक्स के साथ भी चेक करें और फिर डिक्स्ड करें कि उस क्वेरी का क्या होगा सूचकांक ..
गुल्ली मिल

जवाबों:


3

प्रदर्शन अनुकूलन। पीके या एक इंडेक्स को हटाने से, मेरे इंडेक्स के लिए कम पृष्ठों की आवश्यकता होगी = तेजी से लिखता है, साथ ही रखरखाव / परिचालन लाभ, यानी डीफ़्रैग्मेन्ट रखने के लिए एक कम इंडेक्स भी।

आपको यह साबित करने में सक्षम होना चाहिए कि जो प्रस्तावित है वह वास्तव में मदद करेगा (लागत बनाम लाभ)। इस बदलाव को किस कारण से माना जा रहा है? क्या वास्तव में इस तालिका के साथ प्रदर्शन के मुद्दे हैं, या यह सिर्फ "गलत दिख रहा है"?

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

  • रखरखाव विंडो में कितना समय बचाया जाएगा? बैकअप विंडो में?

  • यह कितना संग्रहण स्थान बचाएगा (डेटा फ़ाइलें, लॉग फ़ाइलें, बैकअप, आदि)?

  • क्या वास्तव मेंINSERT इस तालिका में प्रदर्शन अभी एक अड़चन है? इसमें कितना सुधार होगा? क्या किसी सूचकांक को उस समस्या को ठीक करने के लिए सबसे अच्छी रणनीति को हटाना है?

  • क्या यह डेटाबेस टूल्स और फ्रेमवर्क (ORMs) के साथ समस्या पैदा करेगा, जो उम्मीद करता है कि प्रत्येक टेबल में एक प्राथमिक कुंजी होगी और न केवल एक अद्वितीय सूचकांक? लेन-देन प्रतिकृति को प्रकाशित तालिकाओं पर एक प्राथमिक कुंजी की आवश्यकता होती है।

  • क्या स्व-दस्तावेजीकरण डेटाबेस स्कीमा महत्वपूर्ण है?

  • अपने सीमित उपयोग के बावजूद, प्राथमिक कुंजी सूचकांक की संकीर्णता अभी भी ऑप्टिमाइज़र को कुछ प्रश्नों के लिए अधिक कुशल योजनाएं बनाने की अनुमति दे रही है? ( sys.dm_db_index_usage_statsयह पता लगाने के लिए उपयोग करें ।)

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


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

2

उस तालिका पर एकमात्र प्रकार की क्वेरी जो बुरा प्रदर्शन करेगी (और केवल थोड़ा खराब होगा) वे होंगे जो कि की-कॉलम मूल्यों की एक श्रृंखला का अनुरोध करते हैं - जैसे कि उन प्रश्नों को इस समय आपके पीके भर में एक इंडेक्स की तलाश में सबसे अच्छा किया जाएगा।

यह ध्यान देने योग्य होगा कि तालिकाओं के लिए संदर्भात्मक अखंडता की लागत जो इस तालिका को संदर्भित करती है, उच्चतर होगी (फिर से केवल थोड़ी अधिक)।

जब तक आप अशक्त पहलू का ध्यान रखते हैं, तब तक आपको एक सूचकांक के साथ ठीक होना चाहिए।

यदि यह मेरा डीबी होता, तो मैं शायद सिंगल यूनिक इंडेक्स के लिए जाता, बाकी सभी चीजें बराबर होतीं।


धन्यवाद - क्या आपके पास कोई संदर्भ लिंक है? wrt थोड़ा बदतर है, क्या आप केवल कवर इंडेक्स में कम इंडेक्स घनत्व का उल्लेख कर रहे हैं, या कुछ और है जो इसका कारण होगा?
स्टुअर्टएलसी

यह दुर्भाग्य से बहुत सारे अनुभव से है, और वर्षों से मुझसे ज्यादा स्मार्ट लोगों के साथ चैट करना है! और हाँ, यह ठीक है कि - प्रति पृष्ठ कम पंक्तियाँ होंगी, इसलिए I / O अधिक होगी। हालाँकि - यह ध्यान देने योग्य है कि INCLUDE कॉलम केवल पत्ती स्तर में ही मौजूद हैं। तो यह सब बुरा नहीं है। मुझे यकीन है कि आप जानते हैं कि आपके प्रश्न में विस्तार के आधार पर, लेकिन मैं अनुमान लगा रहा हूं कि अन्य पाठक नहीं कर सकते हैं।
मैट व्हिटफील्ड

-2

जहाँ तक मुझे पता है, एक प्राथमिक कुंजी में कवरिंग कॉलम जोड़ना संभव नहीं है

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

ऐसा इसलिए है क्योंकि एक गुच्छेदार सूचकांक अनुक्रमणिका नहीं है, लेकिन सूचकांक के क्रम में तालिका की पंक्तियों को संग्रहीत करने के लिए सिर्फ एक निर्देश है। और एक बार जब आप प्राथमिक कुंजी द्वारा एक पंक्ति को जोर से दबाते हैं, तो आपके पास अन्य सभी कॉलम हैं।


2
पहले पैराग्राफ से:The table is clustered by another column entirely.
JNK

5
मुझे लगता है कि यहां कुछ प्राथमिक कुंजी / क्लस्टर इंडेक्स भ्रम हो सकता है। प्रबंधन स्टूडियो द्वारा आपको मनाने के सर्वोत्तम प्रयासों के बावजूद, वे समान चीज नहीं हैं।
मैट व्हिटफील्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.