मेरे पास 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
CustomerId
Customer
तालिका के लिए एक विदेशी कुंजी है , इसलिए क्लस्टरिंग इंडेक्स के साथCustomerId
जुड़ने की गति तेज होनी चाहिए- जबकि
CustomerId
अद्वितीय नहीं है, अतिरिक्त होनेOrderId
सूचकांक में निर्दिष्ट स्तंभ विशिष्टता यह सुनिश्चित करेंगे (हम उपयोग कर सकते हैंUNIQUE
जब उन 2 कॉलम पर संकुल अनुक्रमणिका बनाने कीवर्ड, विशिष्टता नहीं होने की भूमि के ऊपर से बचने के लिए) - एक बार डेटा डालने के बाद,
CustomerId
औरOrderId
कभी नहीं बदलता है, इसलिए ये पंक्तियाँ प्रारंभिक लेखन के बाद चारों ओर नहीं घूमेंगी। - डेटा का उपयोग एक ORM के माध्यम से होता है जो डिफ़ॉल्ट रूप से सभी स्तंभों का अनुरोध करता है, इसलिए जब कोई क्वेरी
CustomerId
अंदर आती है, तो क्लस्टर इंडेक्स बिना किसी अतिरिक्त कार्य के सभी कॉलम प्रदान करने में सक्षम होगा।
क्या ऊपर दिए गए सर्वश्रेष्ठ विकल्प की तरह ध्वनि CustomerId
और OrderId
दृष्टिकोण ध्वनि है? या, यह OrderId
अपने आप बेहतर है, क्योंकि यह एक एकल स्तंभ है जो अपने आप में विशिष्टता की गारंटी दे रहा है?
वर्तमान में, तालिका में एक क्लस्टर अनुक्रमणिका OrderId
और एक गैर-अनुक्रमित अनुक्रमणिका है CustomerId
, लेकिन यह कवर नहीं कर रहा है, इसलिए जब से हम ORM का उपयोग कर रहे हैं और सभी स्तंभों का अनुरोध किया गया है, उन्हें पुनः प्राप्त करना अतिरिक्त कार्य है। इसलिए इस पोस्ट के साथ, मैं बेहतर सीआई के साथ प्रदर्शन में सुधार करने पर विचार करने की कोशिश कर रहा हूं।
हमारे DB पर गतिविधि लगभग 85% पढ़ती है और 15% लिखता है।