EF কোড প্রথম সমস্ত স্ট্রিংয়ের জন্য এনভারচার (সর্বাধিক) ব্যবহার করে। এটি কি কোয়েরি পারফরম্যান্সকে আঘাত করবে?


29

এন্টি ফ্রেমওয়ার্ক কোড প্রথমটি ব্যবহার করে আমার কিছু ডাটাবেস তৈরি হয়েছে; অ্যাপ্লিকেশনগুলি কাজ করছে এবং সাধারণভাবে আমি কোড ফার্স্ট আমাকে যা করতে দেয় তাতে আমি বেশ খুশি। আমি প্রথমে একজন প্রোগ্রামার এবং ডিবিএ দ্বিতীয়, প্রয়োজন অনুসারে। আমি সি # তে আরও বর্ণনা করতে ডেটাঅ্যাট্রিবিউট সম্পর্কে পড়ছি যা আমি ডাটাবেসটি করতে চাই; এবং আমার প্রশ্ন হ'ল: আমার টেবিলে এই nvarchar(max)স্ট্রিংগুলি রেখে আমি কী জরিমানা খাচ্ছি (নীচে উদাহরণ দেখুন)?

এই নির্দিষ্ট সারণীতে বেশ কয়েকটি কলাম রয়েছে; সি # তে এগুলি সংজ্ঞায়িত করা হয়:

    [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; }

নাম, উত্স, উত্পন্ন এবং লিখিত উপর ভিত্তি করে আমি কোয়েরি এবং / অথবা সাজানোর আশা করি। আমি আশা করি নাম এবং উত্সটি মাঝে মাঝে 150- এর মধ্যে 0-50 বর্ণের দৈর্ঘ্যের মধ্যে থাকবে I স্পষ্টতই বার্তাটি ছোট বা বড় হতে পারে এবং সম্ভবত এর বিরুদ্ধে জিজ্ঞাসা করা হবে না।

আমি যা জানতে চাই, আমার নাম এবং উত্স কলামগুলির জন্য এমন কোনও পারফরম্যান্স হিট হয়েছে nvarchar(max)যখন আমি কখনই সেগুলি 150 টি অক্ষরের চেয়ে বড় হওয়ার আশা করি না?


5
দেখে মনে হচ্ছে আপনার কোনওটি[MaxLength] বা [StringLength]বৈশিষ্ট্য প্রয়োগ করা দরকার । @
মার্টিন স্মিথ

3
হ্যাঁ , varchar(max)সর্বত্র ব্যবহার করা আপনার পারফরম্যান্সকে ব্যথা দেয় - এটি করবেন না! ব্যবহার করুন উপযুক্ত ব্যবহার - datatypes varchar(max) শুধুমাত্র যদি আপনি প্রকৃতই চেয়ে বেশি 8000 অক্ষর প্রয়োজন! (আমি কখনই কোনও ব্যক্তির নাম বা ইমেলটি এত দীর্ঘ হতে দেখিনি!) - দেখুন ভিচারার (প) এর পরে কী কী আছে? আরও তথ্যের জন্য
মারক_স

@marc_s দুর্দান্ত লিঙ্ক। আমি জানি এটি পারফরম্যান্সের ক্ষতি করে। যখন আমি এসকিউএল দিয়ে আমার নিজস্ব টেবিলগুলি সংজ্ঞায়িত করি তখন আমি বর্ণচর (এন) ব্যবহার করি। এটি আমার কার্য সম্পাদনকে কতটা ব্যথিত করে তা সম্পর্কে আরও ছিল (যদিও আমি পোস্ট হিসাবে বুঝতে পারি যা স্পষ্টভাবে পরিষ্কার ছিল না)।
নাট

উত্তর:


24

বৃহত্তর এনভারচার (সর্বাধিক) ডেটা আইটেমগুলি (8000 বাইটের বেশি বা তার বেশি) পাঠ্য সঞ্চয়স্থানে ছড়িয়ে পড়বে এবং অতিরিক্ত আই / ও প্রয়োজন হবে। ছোট আইটেমগুলি সারি-সারি সংরক্ষণ করা হবে। এই আচরণটি নিয়ন্ত্রণ করে এমন বিকল্প রয়েছে - আরও তথ্যের জন্য এই এমএসডিএন নিবন্ধটি দেখুন।

যদি সারি সজ্জিত থাকে তবে উল্লেখযোগ্য I / O কার্যকারিতা ওভারহেড নেই; ডেটা প্রকার প্রক্রিয়া করার জন্য অতিরিক্ত সিপিইউ ওভারহেড থাকতে পারে তবে এটি অপ্রত্যাশিত হওয়ার সম্ভাবনা রয়েছে।

যাইহোক, ডাটাবেস যেখানে প্রয়োজন হয় না সেখানে Nvarchar (সর্বাধিক) কলামগুলি পড়ে থাকাগুলি কেবল ফর্ম নয়। এটিতে কিছুটা পারফরম্যান্স ওভারহেড থাকে এবং প্রায়শই ডেটা মাপগুলি ডেটা টেবিলটি বোঝার ক্ষেত্রে বেশ সহায়ক হয় - উদাহরণস্বরূপ, 50 বা 100 অক্ষর প্রস্থের একটি ভারচার কলাম সম্ভবত একটি বর্ণনা বা একটি ফ্রি-টেক্সট ক্ষেত্র হতে পারে যেখানে এটি (বলা হয়) 10- ২০ টি চর লিঙ্গ সম্ভবত একটি কোড হতে পারে। আপনি অবাক হবেন যে এর প্রায়শই এরকম অনুমানের মাধ্যমে একটি ডেটাবেস থেকে প্রায়শই বোঝা যায়।

ডেটা গুদামজাতকরণে কাজ করা, প্রায়শই দুর্বল সমর্থিত বা ডকুমেন্টেড লিগ্যাসি সিস্টেমগুলিতে না করা, একটি ডেটাবেস স্কিমা যা বোঝা সহজ quite আপনি যদি অ্যাপ্লিকেশনটির উত্তরাধিকার হিসাবে ডাটাবেসটিকে ভাবেন, তবে আপনার কাছ থেকে এটি উত্তরাধিকারী হতে চলেছে এমন লোকদের সাথে সুন্দর হওয়ার চেষ্টা করুন।


18

যদিও এটি আপনার নির্দিষ্ট প্রশ্নের উত্তর দেয় না, তবে আপনাকে প্রথমে প্রশ্নটি জিজ্ঞাসা করার প্রয়োজন থেকে বিরত রাখতে পারে: আপনার সি # মডেল শ্রেণিতে আপনার স্ট্রিং ভেরিয়েবলের উপর একটি দৈর্ঘ্য নির্ধারণ করা সম্ভব হবে, যার ফলে সত্তা ফ্রেমওয়ার্ক এসকিউএল তৈরি করবে যে 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; }

উত্স: https://stackoverflow.com


2
এটি জানতে পেরে আমাকে এই উত্তরটি খুঁজে পেতেছিল যে EF কোর একই সাথে ( varchar(50)) সেট করার ধরণ এবং দৈর্ঘ্য সমর্থন করে but তবে এএফ 6 এর উত্তরটিতে কী প্রয়োজন।
সিঞ্জাই

9

সবচেয়ে বড় উদ্বেগের সূচক। বিওএল থেকে:

কলাম যে বৃহৎ বস্তু (lob) ডেটা ধরনের হয় ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, অথবা imageএকটি সূচক জন্য কী কলাম হিসাবে নির্দিষ্ট করা যাবে না।

আপনি যদি সঠিকভাবে সূচী করতে না পারেন তবে আপনার ধীরে ধীরে প্রশ্ন থাকবে। এবং ডেটা অখণ্ডতার দৃষ্টিকোণ থেকে, nvarchar(max)সীমা নির্দিষ্টকরণের চেয়ে ক্ষেত্রের মধ্যে আরও খারাপ ডেটা স্থাপনের অনুমতি দেওয়া হবে।


9

হ্যাঁ, ম্যাপিং এ ডিফল্ট মতিন আচরণ stringকরতে nvarchar(max)ভাল হয় না। EF 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 কোর 1.0 এ কাজ করে না
শিট্টু জোসেফ ওলুগবেঙ্গা

the default EF behavior in mapping string to nvarchar(max) is not goodএটি আপনার সাধারণ মতামত বলে মনে হচ্ছে। কেন আপনি ভাল ব্যাখ্যা করতে পারেন না? অথবা, আপনি কী ভাবেন, EF ব্যবসায়িক অ্যাপ্লিকেশনগুলির একটি কাঠামো নয় যেখানে আপনার একাধিক ভাষা নিয়ে কাজ করা দরকার? কারণ এটি ডাটাবেসে একাধিক ভাষা পরিচালনা করার জন্য কাঙ্ক্ষিত কলাম-প্রকার type
ম্যাথিয়াস বার্গার

1
@ মাথিয়াসবার্গার এনভারচার (সর্বাধিক) কর্মক্ষেত্রের জন্য, বিশেষত একটি প্রতিরূপিত পরিবেশে ভয়ঙ্কর। এটি সাধারণীকরণের মতামত নয়, এটি একটি সুপরিচিত সত্য।
ব্যবহারকারী 2966445

@ ব্যবহারকারী 2966445 দুঃখিত, আমি মনে করি যে এখানে একটি ভুল বোঝাবুঝি হয়েছিল :) অবশ্যই, maxভয়াবহ। তবে আপনি যদি একাধিক ভাষা (এবং তাদের বিভিন্ন চরিত্রগুলি) পরিচালনা করতে চান তবে আপনার কি nvarcharভুল হওয়া উচিত?
ম্যাথিয়াস বার্গার

@ মাথিয়াসবার্গার এটি সঠিক, বিভিন্ন চরিত্রের জন্য এনভারচার ব্যবহার করুন, তবে এই পুরো পোস্টটি পারফরম্যান্স এবং ফিল্ডের দৈর্ঘ্য সম্পর্কিত, এনভারচার বনাম ভারচারের ব্যবহার নয়।
ব্যবহারকারী 2966445
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.