2011-03-22 20 views
5

के साथ डेटाबेस इंडेक्स प्रबंधित करने का सही तरीका मैं अपना आवेदन एंटिटी फ्रेमवर्क (मॉडल पहला सिद्धांत) के साथ बना रहा हूं। मैं अपने आवेदन के सभी डेटा को स्टोर करने के लिए एमएस एसक्यूएल सर्वर 2008 का भी उपयोग कर रहा हूं।एंटिटी फ्रेमवर्क

विकासशील मैं निम्नलिखित कोड है कुछ समय के बाद:

public partial class EventInfo 
{ 
    #region Primitive Properties 

    public virtual int Id 
    { 
     get; 
     set; 
    } 

    public virtual string EventName 
    { 
     get; 
     set; 
    } 

    public virtual string EventKey 
    { 
     get; 
     set; 
    } 

    public virtual System.DateTime DateStamp 
    { 
     get; 
     set; 
    } 

    #endregion 
} 

और दृश्य स्टूडियो डेटाबेस डिजाइनर एसक्यूएल कोड का विशेष हिस्सा बनाया है डेटाबेस के लिए इस इकाई को मैप करने के:

-- Creating table 'EventInfoSet' 
CREATE TABLE [dbo].[EventInfoSet] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [EventName] nvarchar(max) NOT NULL, 
    [EventKey] nchar(32) NOT NULL, 
    [DateStamp] datetime NOT NULL 
); 

और बेशक, आईडी संपत्ति के लिए एक सूचकांक

-- Creating primary key on [Id] in table 'EventInfoSet' 
ALTER TABLE [dbo].[EventInfoSet] 
ADD CONSTRAINT [PK_EventInfoSet] 
    PRIMARY KEY CLUSTERED ([Id] ASC); 

EventKey स्ट्रिंग है, और वास्तव में मैं इसे md5 हैश (स्ट्रिंग प्रस्तुति में) स्टोर करने के लिए उपयोग करता हूं। लेकिन बात यह है कि अपने मुख्य कोड की तरह लग रहा है:

int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey).Count(); 

और

int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey && e.DateStamp >= dateFrom && e.DateStamp < dateTo).Count(); 

eventKey यहाँ एक स्ट्रिंग चर रहा है। जैसा कि आप देख सकते हैं, मैं अक्सर EventKey संपत्ति से निपटता हूं। लेकिन मेरी तालिका में बड़ी मात्रा में रिकॉर्ड्स (5 एम तक) हो सकते हैं। और मुझे जितनी जल्दी हो सके काम करने के लिए इस कोड की आवश्यकता है। मुझे इवेंटकी को डिज़ाइनर में इंडेक्स प्रॉपर्टी के रूप में चिह्नित करने का कोई विकल्प नहीं मिला। और मैं जानना चाहता हूं:

  1. मैं चीजों को तेज़ी से कैसे बना सकता हूं? मुझे इसके बारे में चिंता करने की ज़रूरत है मेरे कोड के साथ?
  2. क्या कोई सौम्य तरीका को मजबूर करने के लिए .NET विकास पर्यावरण सूचकांक फ़ील्ड स्वचालित रूप से उत्पन्न करता है?
  3. यदि कोई सौम्य तरीका नहीं है, और मुझे इसे मैन्युअल रूप से अपडेट करना है, तो मैं इसे स्वचालित रूप से करने के लिए बेहतर तरीके से कैसे व्यवस्थित कर सकता हूं?
  4. क्या आप मुझे आलेखों के साथ एक लिंक दे सकते हैं, इन सभी चीजों को इंडेक्स के साथ समझाते हुए, क्योंकि मेरे ज्ञान में की कमी है।

धन्यवाद!

+0

कुछ विचारों के लिए इन अन्य [एसएफ प्रश्नों पर पहले प्रश्न] देखें (http://stackoverflow.com/questions/3333674/entity-framework-4-add-index-in-model-first-design) कुछ विचारों के लिए –

+2

5 एम कहीं भी विशाल, बीटीडब्ल्यू के पास नहीं है। –

उत्तर

5

और बेशक, ईद संपत्ति

'निश्चित रूप से' क्यों के लिए एक सूचकांक?

CREATE CLUSTERED INDEX cdx_EventInfoSet 
    ON [dbo].[EventInfoSet] ([EventKey], [DateStamp]); 
ALTER TABLE [dbo].[EventInfoSet] 
    ADD CONSTRAINT [PK_EventInfoSet]  
    PRIMARY KEY NONCLUSTERED ([Id] ASC); 

याद रखें, क्लस्टर कुंजी और प्राथमिक कुंजी हैं: आपका मुख्य पहुँच है, तो के रूप में आप अपने आप को स्वीकार करते हैं, तो EventKey, या EventKey और DateStamp द्वारा गिनती करने के लिए अपने सबसे अच्छे क्लस्टर कुंजी (EventKey, DateStamp), नहीं ID है दो अलग, असंबंधित, अवधारणाओं। आपको पहले Designing Indexes पढ़ना चाहिए (लिंक में सभी उप-विषयक सहित)।

+0

मैं बस दिन जा रहा था - एक कंपाउंड क्लस्टर्ड इंडेक्स (इवेंटकी, डेटस्टैम्प) शायद एक बहुत ही बुद्धिमान विकल्प नहीं है .... बहुत व्यापक, परिसर, संभवतः बदल रहा है, और निश्चित रूप से कभी नहीं बढ़ रहा है ... –

+0

एक्सेस पैटर्न ट्रम्प सूचकांक चौड़ाई और विखंडन। Altough दोनों उदाहरण क्वेरी समेकित हैं और एक गैर-क्लस्टर इंडेक्स द्वारा भी सेवा दी जा सकती है, मैं अपेक्षाकृत अधिक समान पहुंच पैटर्न की अपेक्षा करता हूं जिसके लिए कवरेज प्रदान करने के लिए अधिक से अधिक फ़ील्ड शामिल होंगे। इसलिए अल्टिमेटेल मैं उम्मीद करता हूं कि यह क्लस्टर इंडेक्स हो। –

+2

लेकिन आप सही हैं, अधिक जानकारी की कमी में, अधिक रूढ़िवादी अनुशंसा केवल '(EventKey, DateStamp)' पर एक गैर-क्लस्टर सूचकांक जोड़ना होगा। –

5

इकाई ढांचा आपके लिए सूचकांक नहीं बनाएगा। इकाई ढांचा केवल डेटाबेस के कंकाल बनाता है।यदि आप प्रदर्शन के लिए अपने डेटाबेस को ट्विक करना चाहते हैं (जैसे इंडेक्स जोड़ना) तो आपको इसे अपने आप करना होगा। इसके बाद आप पहले डेटाबेस में स्विच कर सकते हैं या आप इसे पुनर्निर्मित करने के बजाय अपने डेटाबेस को अपडेट करने के लिए Entity Designer Database Generation Power Pack का उपयोग कर सकते हैं (आपको कम से कम वीएस 2010 प्रीमियम की आवश्यकता होगी)।

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