2009-02-03 6 views
118

मान लीजिए मेरे पास 2 टेबल, उत्पाद और उत्पाद श्रेणियां हैं। दोनों टेबलों में Category आईडी पर संबंध है। और यह सवाल है।विदेशी कुंजी क्वेरी प्रदर्शन में सुधार करता है?

SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
FROM Products p 
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId 
WHERE c.CategoryId = 1; 

जब मैं निष्पादन योजना बनाने, टेबल ProductCategories क्लस्टर सूचकांक की तलाश, उम्मीद के रूप में है जो प्रदर्शन करती है। लेकिन टेबल उत्पादों के लिए, यह क्लस्टर इंडेक्स स्कैन करता है, जो मुझे संदेह करता है। क्यों एफके क्वेरी प्रदर्शन में सुधार करने में मदद नहीं करता है?

इसलिए मुझे Products.CategoryId पर अनुक्रमणिका बनाना है। जब मैं फिर से निष्पादन योजना बना देता हूं, तो दोनों टेबल इंडेक्स की तलाश करते हैं। और अनुमानित उप-लागत लागत बहुत कम हो गई है।

मेरे प्रश्न हैं:

  1. FK बगल संबंध बाधा पर मदद करता है, यह किसी भी अन्य उपयोगिता है? क्या यह क्वेरी प्रदर्शन में सुधार करता है?

  2. क्या मुझे सभी तालिकाओं में सभी एफके कॉलम (पसंद किए गए Products.CategoryId) पर इंडेक्स बनाना चाहिए?

उत्तर

155

विदेशी कुंजी एक रेफरेंसियल अखंडता उपकरण है, न कि एक प्रदर्शन उपकरण। कम से कम SQL सर्वर में, एक एफके का निर्माण संबंधित इंडेक्स नहीं बनाता है, और आपको लुकअप टाइम्स को बेहतर बनाने के लिए सभी एफके फ़ील्ड पर इंडेक्स बनाना चाहिए।

+9

+1: मॉडल एक बात है। प्रदर्शन एक और है। –

+27

अच्छे मॉडल (आमतौर पर) बेहतर प्रदर्शन करते हैं। –

+7

"विदेशी कुंजी एक संबंधपरक अखंडता उपकरण हैं" - कृपया देखभाल के साथ 'संबंधपरक' शब्द का उपयोग करें। विदेशी कुंजी एक डेटाबेस अवधारणा है, एक संदर्भित अखंडता बाधा के लिए एक छोटा हाथ है। वे संबंधपरक मॉडल का हिस्सा नहीं हैं। मुझे लगता है कि आपने एक टाइपो बनाया है। – onedaywhen

13

एक विदेशी कुंजी डेटाबेस अखंडता सुनिश्चित करने के लिए एक डीबीएमएस अवधारणा है।

कोई प्रदर्शन प्रभाव/सुधार डेटाबेस तकनीक के लिए विशिष्ट होगा और विदेशी कुंजी के उद्देश्य के लिए माध्यमिक होगा।

यह सुनिश्चित करने के लिए SQL सर्वर में यह अच्छा अभ्यास है कि सभी विदेशी कुंजीों पर कम से कम एक गैर क्लस्टर इंडेक्स है।

मुझे आशा है कि यह आपके लिए चीजों को साफ़ कर देगा लेकिन कृपया अधिक जानकारी के लिए नि: शुल्क संपर्क करें।

+4

प्रदर्शन 'डेटाबेस अखंडता' से एक आसान बिक्री है। –

+8

@ केनी एविट यदि आपके पास ईमानदारी नहीं है, तो आपका डेटा बेकार है। मुझे लगता है कि बहुत आसानी से बेचता है। – HLGEM

+0

@HLGEM एक [404 त्रुटि] प्राप्त करना (http://en.wikipedia.org/wiki/HTTP_404) थोड़ी देर में अभी भी काफी सहनशील है। सस्ते संसाधनों और कम जटिल प्रणालियों का उपयोग करके बदले में असाधारण थ्रूपुट होने के बाद, अब यह बहुत आसानी से बेचता है। आपको [सीएपी) में दिलचस्पी हो सकती है प्रमेय] (http://en.wikipedia.org/wiki/CAP_theorem)। –

47

विदेशी कुंजी सुधार कर सकते हैं (और चोट) प्रदर्शन

  1. के रूप में यहां कहा गया है: Foreign keys boost performance

  2. तुम हमेशा FK स्तंभों पर अनुक्रमणिका बनाना चाहिए लुकअप कम करने के लिए। SQL सर्वर स्वचालित रूप से ऐसा नहीं करता है।

संपादित

लिंक के रूप में अब, (देख के लिए क्रिस के लिए प्रशंसा)मृत हो रहा है निम्नलिखित क्यों विदेशी कुंजी सुधार कर सकते हैं (और चोट) प्रदर्शन का सार को दर्शाता है।

Can Foreign key improve performance

विदेशी कुंजी बाधा डाटा पढ़ने के समय में प्रदर्शन में सुधार, लेकिन एक ही समय में यह डालने/बदलाव/डेटा हटाना के समय में प्रदर्शन को धीमा कर देती।

क्वेरी पढ़ने के मामले में, अनुकूलक पर विदेशी कुंजी बाधाओं का उपयोग कर सकते हैं और अधिक कुशल क्वेरी योजनाएं बनाते हैं क्योंकि विदेशी कुंजी बाधाएं पूर्व घोषित नियम हैं। इसमें आम तौर पर क्वेरी प्लान के कुछ भाग को छोड़ना शामिल है क्योंकि उदाहरण के लिए ऑप्टिमाइज़र देख सकता है कि एक विदेशी कुंजी बाधा के कारण, को उस योजना का विशेष भाग निष्पादित करने के लिए अनावश्यक है।

+2

यहां एक लिंक है जिसमें वे प्रदर्शन के तरीके को प्रदर्शित कर सकते हैं जिसमें http://www.devx.com/getHelpOn/10MinuteSolution/16595/0/page/2 – cmsjr

+2

यह समझ में आता है लेकिन आप केवल इसे बड़े पैमाने पर चलाएंगे कथन हटाएं। शायद निष्कर्ष यह होना चाहिए कि ओलाप वातावरण में, गैर-अनुक्रमित एफके ओएलटीपी वातावरण में प्रदर्शन में सुधार करेगा, यह प्रदर्शन को कम कर देगा। –

+1

इस उत्तर में लिंक मृत है। यह दुर्भाग्यपूर्ण है क्योंकि एफके के प्रदर्शन में सुधार के लिए यह एकमात्र तर्क है। –

3

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

तो यह:

select p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
from Products p inner join ProductCategories c on p.CategoryId = c.CategoryIdwhere c.CategoryId = 1; 

इस बन जाता है:

SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
FROM ProductCategories c 
LEFT OUTER JOIN Products P ON 
c.CategoryId = p.CategoryId 
WHERE c.CategoryId = 1; 

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

+3

न केवल आंतरिक जुड़ने वाले (_stackoverflow.com/a/2726683/155892) से बाहरी रूप से _less_ कुशल होते हैं, अब आपके प्रश्न भ्रामक हैं: आप डेटाबेस पर भरोसा कर रहे हैं ताकि आंतरिक रूप से आंतरिक जुड़ने में आपके बाहरी शामिल हो जाएं (प्रदर्शन को बहाल करना) बस स्पष्ट रूप से ऐसा करने के बजाय –

4

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

1

मुझे SQL सर्वर के बारे में बहुत कुछ पता नहीं है, लेकिन ओरेकल के मामले में, एक विदेशी कुंजी कॉलम होने से डेटा लोडिंग का प्रदर्शन कम हो जाता है। ऐसा इसलिए है क्योंकि डेटाबेस को प्रत्येक सम्मिलन के लिए डेटा अखंडता की जांच करने की आवश्यकता होती है। और हां, जैसा कि पहले से ही उल्लेख किया गया है, विदेशी कुंजी कॉलम पर एक इंडेक्स रखना एक अच्छा अभ्यास है।

1

तालिका में एक विदेशी कुंजी जोड़ना प्रदर्शन में सुधार नहीं करेगा, बस यह कहकर कि आप उत्पाद श्रेणियों तालिका डेटाबेस में एक रिकॉर्ड डालने वाले हैं, तो विदेशी कुंजी कॉलम में एक मान है जो किसी उत्पाद तालिका के प्राथमिक कुंजी मान में मौजूद है, यह देखो, जब भी आप ProductCategories तालिका में कोई नई प्रविष्टि जोड़ते हैं, तो ऑपरेशन आपके डेटाबेस पर ओवरहेड होता है। तो एक विदेशी कुंजी जोड़कर आपके डेटाबेस प्रदर्शन में सुधार नहीं होगा, लेकिन यह आपके डेटाबेस की अखंडता की परवाह करेगा। हां यह आपके डीबी के प्रदर्शन में सुधार करेगा यदि आप अपने प्रोग्राम में डेटाबेस में रिकॉर्ड की जांच के लिए कई प्रश्नों को चलाने के बजाय विदेशी कुंजी का उपयोग करके अखंडता की जांच कर रहे हैं।

0

SQL सर्वर 2008 के रूप में विदेशी कुंजी क्वेरी इंजन को अनुकूलित करने के तरीके को प्रभावित करने के तरीके को प्रभावित करके प्रदर्शन को प्रभावित कर सकती है। निम्नलिखित आलेख में स्टार जॉइन हेरिस्टिक्स का संदर्भ लें: https://technet.microsoft.com/en-us/library/2008.04.dwperformance.aspx