EF कोड पहले सभी स्ट्रिंग्स के लिए nvarchar (अधिकतम) का उपयोग करता है। क्या इससे क्वेरी का प्रदर्शन प्रभावित होगा?


29

मेरे पास Entity Framework Code First का उपयोग करके कुछ डेटाबेस बनाए गए हैं; एप्लिकेशन काम कर रहे हैं और सामान्य तौर पर मैं पहले कोड क्या करता है के साथ बहुत खुश हूँ। मैं एक प्रोग्रामर पहले, और एक डीबीए दूसरा, आवश्यकता से। मैं C # में आगे वर्णन करने के लिए DataAttributes के बारे में पढ़ रहा हूं कि मैं क्या करना चाहता हूं डेटाबेस; और मेरा प्रश्न यह है कि मैं nvarchar(max)अपनी तालिका में इन तारों के होने से क्या दंड खाऊंगा (नीचे उदाहरण देखें)?

इस विशेष तालिका में कई स्तंभ हैं; C # में उन्हें इस प्रकार परिभाषित किया गया है:

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Message { get; set; }
    public string Source { get; set; }
    public DateTime Generated { get; set; }
    public DateTime Written { get; set; }

मैं नाम, स्रोत, उत्पन्न और लिखित के आधार पर क्वेरी और / या सॉर्ट करने की अपेक्षा करता हूं। मुझे नाम और स्रोत 0-50 चरित्र की लंबाई में होने की उम्मीद है, कभी-कभी 150 तक। मैं इस तालिका को बहुत छोटे (<100k पंक्तियों) शुरू करने की उम्मीद करता हूं, लेकिन समय के साथ काफी बढ़ जाता है (> 1 मीटर पंक्तियां)। जाहिर तौर पर संदेश छोटा या बड़ा हो सकता है, और संभवतः इसके खिलाफ नहीं होगा।

क्या मैं जानना चाहता हूं, क्या मेरे नाम और स्रोत स्तंभों के लिए एक प्रदर्शन हिट है, nvarchar(max)जब मैं उनसे 150 वर्णों से बड़ा होने की उम्मीद नहीं करता?


5
ऐसा लगता है कि आपको [MaxLength]या तो [StringLength]विशेषताओं को लागू करने की आवश्यकता है । बहुत व्यापक स्तंभों के कुछ अतिरिक्त संभावित नकारात्मक कारकों का उल्लेख यहाँ @ पॉलवाइट के उत्तर में किया गया है
मार्टिन स्मिथ

3
हाँ , varchar(max)हर जगह का उपयोग आपके प्रदर्शन को नुकसान पहुँचाता है - ऐसा मत करो! उचित डेटाटिप्स का उपयोग करें - varchar(max) केवल तभी उपयोग करें जब आपको वास्तव में 8000 से अधिक वर्णों की आवश्यकता हो! (मैंने किसी व्यक्ति का नाम या ई-मेल इतने लंबे समय तक नहीं देखा है!) - देखें क्या है VARCHAR (n) प्रयोग का बिंदु? अधिक जानकारी के लिए
marc_s

@marc_s बढ़िया लिंक। मुझे पता है कि यह प्रदर्शन को नुकसान पहुंचाता है। जब मैं SQL के साथ अपनी खुद की तालिकाओं को परिभाषित करता हूं तो मैं varchar (n) का उपयोग करता हूं। मेरा प्रश्न इस बारे में अधिक था कि यह प्रदर्शन को कितना प्रभावित करता है (हालांकि मुझे एहसास हुआ कि पोस्ट किया गया था जो स्पष्ट रूप से स्पष्ट नहीं था)।
नैट

जवाबों:


24

बड़े nvarchar (अधिकतम) डेटा आइटम (8000 बाइट्स या इससे अधिक) पाठ भंडारण में फैल जाएंगे और अतिरिक्त I / O की आवश्यकता होगी। छोटे आइटम को इन-रो में संग्रहीत किया जाएगा। इस व्यवहार को नियंत्रित करने वाले विकल्प हैं - अधिक विवरण के लिए इस MSDN लेख को देखें।

यदि पंक्ति में संग्रहीत कोई महत्वपूर्ण I / O प्रदर्शन ओवरहेड नहीं है; डेटा प्रकार को संसाधित करने पर अतिरिक्त CPU ओवरहेड हो सकता है लेकिन यह मामूली होने की संभावना है।

हालांकि, डेटाबेस के चारों ओर झूठ बोल रहे नवरच (अधिकतम) कॉलम को छोड़ना जहां उनकी आवश्यकता नहीं है, बल्कि खराब रूप है। यह कुछ प्रदर्शन ओवरहेड करता है और अक्सर डेटा आकार डेटा तालिका को समझने में काफी मददगार होता है - उदाहरण के लिए, 50 या 100 चार्ट चौड़ा एक वर्चस्व स्तंभ एक विवरण या एक मुक्त-पाठ क्षेत्र होने की संभावना है जहां एक है (कहना) 10- 20 वर्णों की एक कोड होने की संभावना है। आपको आश्चर्य होगा कि इस तरह की धारणाओं के माध्यम से एक डेटाबेस से अक्सर अनुमान लगाने का कितना मतलब होता है।

डेटा वेयरहाउसिंग में काम करना, जितनी बार खराब समर्थित या प्रलेखित विरासत प्रणालियों पर नहीं, एक डेटाबेस स्कीमा जो समझने में आसान है, काफी मूल्यवान है। यदि आप डेटाबेस को एप्लिकेशन की विरासत मानते हैं, तो उन लोगों के लिए अच्छा बनने का प्रयास करें जो इसे आपसे विरासत में लेने जा रहे हैं।


18

यद्यपि यह आपके विशिष्ट प्रश्न का उत्तर नहीं देता है, यह आपको पहली बार में प्रश्न पूछने की आवश्यकता से रोकता है: आपके C # मॉडल वर्ग में अपने स्ट्रिंग चर पर एक लंबाई निर्धारित करना संभव है, जो SQL उत्पन्न करने के लिए Entity फ्रेमवर्क का कारण बनेगा के nvarchar(50)बजाय एक निश्चित-लंबाई वाले नवरच प्रकार (जैसे ) का उपयोग करता है nvarchar(max)

उदाहरण के लिए, इसके बजाय:

public string Name { get; set; }

आप उपयोग कर सकते हैं:

[StringLength(50)]
public string Name { get; set; }

तुम भी होने के लिए मजबूर कर सकते हैं प्रकार varcharके बजाय nvarcharइस प्रकार, अगर वांछित,:

[Column(TypeName = "VARCHAR")]
[StringLength(50)]
public string Name { get; set; }

स्रोत: /programming/7341783/entity-framework-data-annotations-set-stringlength-varchar/7341920


2
मुझे यह पता लगाने के लिए यह उत्तर मिला कि EF Core एक ही समय ( varchar(50)) पर सेटिंग प्रकार और लंबाई का समर्थन करता है , लेकिन EF 6 को इस उत्तर में क्या चाहिए।
सिंजई

9

सबसे बड़ी चिंता का विषय सूचकांक। BOL से:

कॉलम कि बड़ी वस्तु (LOB) डेटा प्रकार के होते हैं ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, या imageएक सूचकांक के लिए महत्वपूर्ण स्तंभ के रूप में निर्दिष्ट नहीं किया जा सकता है।

यदि आप ठीक से इंडेक्स नहीं कर सकते हैं, तो आपके पास धीमी क्वेरी है। और डेटा अखंडता के नजरिए से, nvarchar(max)सीमा को निर्दिष्ट करने की तुलना में अधिक खराब डेटा को एक क्षेत्र में रखने की अनुमति होगी।


9

हाँ, मानचित्रण में डिफ़ॉल्ट एफई व्यवहार stringकरने के लिए nvarchar(max)अच्छा नहीं है। ईएफ 6 में आप अपने स्वयं के पसंदीदा डिफ़ॉल्ट मानचित्रण के साथ इस व्यवहार को ओवरराइड करने के लिए अपने स्वयं के कस्टम सम्मेलन को जोड़ सकते हैं।

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<string>()
        .Configure(s => s.HasMaxLength(200).HasColumnType("varchar") );

    base.OnModelCreating(modelBuilder);
}

OnModelCreatingऊपर के रूप में ओवरराइड करने से सभी स्ट्रिंग्स के लिए डिफ़ॉल्ट मैपिंग बदल जाएगी varchar(200)


1
यह EF Core 1.0
Shittu Joseph Joseph Olugbenga

the default EF behavior in mapping string to nvarchar(max) is not goodयह आपकी सामान्यीकृत राय है। क्या आप बता सकते हैं कि यह अच्छा क्यों नहीं है? या, आपको लगता है, ईएफ व्यापार-अनुप्रयोगों के लिए एक रूपरेखा नहीं है जहां आपको कई भाषाओं के साथ काम करने की आवश्यकता है? क्योंकि यह डेटाबेस पर कई भाषाओं को संभालने के लिए वांछित कॉलम-प्रकार है।
मथायस बर्गर

1
@MatthiasBurger nvarchar (अधिकतम) प्रदर्शन के लिए भयानक है, विशेष रूप से एक प्रतिकृति वातावरण में। यह एक आम राय नहीं है, यह एक प्रसिद्ध तथ्य है।
user2966445

@ user2966445 क्षमा करें, मुझे लगता है कि गलतफहमी थी :) निश्चित रूप से, maxभयानक है। लेकिन अगर आप कई भाषाओं (और उनके विभिन्न चरित्रों) को संभालना चाहते हैं, तो क्या nvarcharमुझे गलत उपयोग करने की आवश्यकता है?
माथियास बर्गर

@MatthiasBurger यह सही है, विभिन्न वर्णों के लिए nvarchar का उपयोग करें, लेकिन यह पूरी पोस्ट प्रदर्शन और फ़ील्ड लंबाई के बारे में है, न कि nvarchar बनाम varchar के उपयोग के बारे में।
user2966445
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.