मेरे पास SQL Server 2014 टेबल है जो निम्न की तरह दिखता है:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
मेरी टीम के कुछ लोगों ने सुझाव दिया है कि क्लस्टर इंडेक्स चालू होना चाहिए OrderId, लेकिन मुझे लगता है कि निम्नलिखित कारणों से CustomerId+ OrderIdएक बेहतर विकल्प होगा:
- लगभग सभी प्रश्न दिख रहे होंगे
WHERE CustomerId = @param, नहींOrderId CustomerIdCustomerतालिका के लिए एक विदेशी कुंजी है , इसलिए क्लस्टरिंग इंडेक्स के साथCustomerIdजुड़ने की गति तेज होनी चाहिए- जबकि
CustomerIdअद्वितीय नहीं है, अतिरिक्त होनेOrderIdसूचकांक में निर्दिष्ट स्तंभ विशिष्टता यह सुनिश्चित करेंगे (हम उपयोग कर सकते हैंUNIQUEजब उन 2 कॉलम पर संकुल अनुक्रमणिका बनाने कीवर्ड, विशिष्टता नहीं होने की भूमि के ऊपर से बचने के लिए) - एक बार डेटा डालने के बाद,
CustomerIdऔरOrderIdकभी नहीं बदलता है, इसलिए ये पंक्तियाँ प्रारंभिक लेखन के बाद चारों ओर नहीं घूमेंगी। - डेटा का उपयोग एक ORM के माध्यम से होता है जो डिफ़ॉल्ट रूप से सभी स्तंभों का अनुरोध करता है, इसलिए जब कोई क्वेरी
CustomerIdअंदर आती है, तो क्लस्टर इंडेक्स बिना किसी अतिरिक्त कार्य के सभी कॉलम प्रदान करने में सक्षम होगा।
क्या ऊपर दिए गए सर्वश्रेष्ठ विकल्प की तरह ध्वनि CustomerIdऔर OrderIdदृष्टिकोण ध्वनि है? या, यह OrderIdअपने आप बेहतर है, क्योंकि यह एक एकल स्तंभ है जो अपने आप में विशिष्टता की गारंटी दे रहा है?
वर्तमान में, तालिका में एक क्लस्टर अनुक्रमणिका OrderIdऔर एक गैर-अनुक्रमित अनुक्रमणिका है CustomerId, लेकिन यह कवर नहीं कर रहा है, इसलिए जब से हम ORM का उपयोग कर रहे हैं और सभी स्तंभों का अनुरोध किया गया है, उन्हें पुनः प्राप्त करना अतिरिक्त कार्य है। इसलिए इस पोस्ट के साथ, मैं बेहतर सीआई के साथ प्रदर्शन में सुधार करने पर विचार करने की कोशिश कर रहा हूं।
हमारे DB पर गतिविधि लगभग 85% पढ़ती है और 15% लिखता है।