উচ্চ ট্রাফিক ওয়েবসাইটগুলির জন্য কী সত্তা ফ্রেমওয়ার্ক উপযুক্ত?


176

সম্ভাব্য 1000 হিট / সেকেন্ড সহ সত্তা ফ্রেমওয়ার্ক 4 কী কোনও পাবলিক ওয়েবসাইটের জন্য ভাল সমাধান?

আমার বোঝার মধ্যে EF বেশিরভাগ ছোট বা ইন্ট্রানেট ওয়েবসাইটগুলির জন্য একটি কার্যকর সমাধান, তবে একটি জনপ্রিয় সম্প্রদায় ওয়েবসাইটের মতো কোনও কিছুর জন্য সহজেই স্কেল করতে পারে না (আমি জানি যে SO লিনক এস এসকিউএল ব্যবহার করছে, তবে .. আমি আরও উদাহরণ / প্রমাণ চাই। ..)

এখন আমি খাঁটি ADO.NET অ্যাপ্রোচ বা ইএফ 4 বেছে নেওয়ার দ্বারে দাঁড়িয়ে আছি। আপনি কি মনে করেন যে ইএফের সাথে উন্নত বিকাশকারী উত্পাদনশীলতা ADO.NET (সঞ্চিত পদ্ধতি সহ) হারানো পারফরম্যান্স এবং দানাদার অ্যাক্সেসের পক্ষে মূল্যবান? উচ্চ ট্র্যাফিক ওয়েবসাইটের মুখোমুখি হতে পারে এমন কোনও গুরুতর সমস্যা, এটি কি ইএফ ব্যবহার করছে?

তুমাকে অগ্রিম ধন্যবাদ.


1
আপনি স্কেলিং বুঝতে পারছেন না। স্কেলিং মানে আপনি যখন 10x ক্ষমতা যুক্ত করেন তখন 10x থ্রুপুট পান। EF কেন এটি হতে বাধা দেবে? এটি কোনও ডাটাবেস কাজের চাপে একটি ধ্রুবক ফ্যাক্টর ওভারহেড যুক্ত করে।
usr ডিরেক্টরির

উত্তর:


152

এটি আপনার কত বিমূর্ততা প্রয়োজন তা কিছুটা নির্ভর করে । সবকিছুই একটি আপস; উদাহরণস্বরূপ, মতিন এবং NHibernate আকর্ষণীয় এবং বহিরাগত মডেলের ডাটা প্রতিনিধিত্বমূলক জন্য মহান নমনীয়তা পরিচয় করিয়ে - কিন্তু এর ফলে তারা কি ওভারহেড যোগ করুন। লক্ষণীয় ওহেড

আপনার যদি ডাটাবেস সরবরাহকারী এবং পৃথক প্রতি ক্লায়েন্ট টেবিল বিন্যাসগুলির মধ্যে স্যুইচ করার দরকার না হয় এবং যদি আপনার ডেটা প্রাথমিকভাবে পড়া হয় এবং যদি আপনাকে EF তে একই মডেলটি ব্যবহার করতে সক্ষম না হয় তবে এসএসআরএস , ADO.NET ডেটা পরিষেবাদি, ইত্যাদি - তারপরে যদি আপনি আপনার মূল পরিমাপ হিসাবে নিখুঁত কর্মক্ষমতা চান তবে আপনি ড্যাপারের চেয়ে আরও খারাপ কাজ করতে পারেন । লিনকিউ-টু-এসকিউএল এবং ইএফ উভয়ের উপর ভিত্তি করে আমাদের পরীক্ষায় আমরা দেখতে পেয়েছি যে কাঁচা পঠন পারফরম্যান্সের ক্ষেত্রে EF উল্লেখযোগ্যভাবে ধীর হয়, সম্ভবতঃ বিমূর্ত স্তরগুলির (স্টোরেজ মডেল ইত্যাদির মধ্যে) এবং বস্তুতীকরণের কারণে।

এখানে এসও, আমরা কাঁচা পারফরম্যান্স সম্পর্কে আবেগপ্রবণ - এবং আমরা গতি অর্জনের জন্য কিছু বিমূর্ততা হারাতে বিকাশের হিট নিতে পেরে আনন্দিত। এর মতো, ডাটাবেস অনুসন্ধানের জন্য আমাদের প্রাথমিক সরঞ্জামটি হ'ল ডিপার । এমনকি এটি আমাদের পূর্ব-বিদ্যমান লিনকিউ-থেকে-এসকিউএল মডেল ব্যবহার করতে দেয় তবে সহজভাবে: এটি দ্রুত গাদা। পারফরম্যান্স পরীক্ষায়, এটি মূলত সমস্ত ADO.NET কোড (পরামিতি, ডেটা-পাঠক ইত্যাদি) ম্যানুয়ালি লেখার মতো একই কার্যকারিতা, তবে কোনও কলামের নাম ভুল হওয়ার ঝুঁকি ছাড়াই। এটি এসকিউএল ভিত্তিক (যদিও এটি যদি আপনার নির্বাচিত বিষ হয় তবে স্প্রোকগুলি ব্যবহার করে খুশি হয়)। এই সুবিধা আছে যে কোন অতিরিক্ত প্রক্রিয়াকরণ জড়িত, কিন্তু এটা হয় যারা SQL এর মত একটি সিস্টেম। যা আমি বিবেচনা করি: খারাপ জিনিস নয়!

একটি সাধারণ ক্যোয়ারী, উদাহরণস্বরূপ, হতে পারে:

int customerId = ...
var orders = connection.Query<Order>(
    "select * from Orders where CustomerId = @customerId ",
    new { customerId }).ToList();

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

এই উত্তরে নোট করুন আমি বলছি না যে EF উচ্চ-ভলিউম কাজের জন্য উপযুক্ত নয় ; সহজভাবে: আমি জানি যে ড্যাপার এটির উপর নির্ভর করে।


25
ডিপারের জন্য +1 পড়া মডেলগুলির জন্য একটি জটিল ওআরএম ব্যবহার করা কেবল অপ্রয়োজনীয়। আমরা এখন যে পদ্ধতি গ্রহণ করি তা হ'ল আমাদের ডোমেন মডেলের জন্য একটি ORM (যেখানে অভিনব ওআরএম স্টাফগুলি আসলে কার্যকর) এবং আমাদের পড়ার মডেলের জন্য ড্যাপার ব্যবহার করা। এটি সুপার ফাস্ট অ্যাপ্লিকেশনগুলির জন্য তৈরি করে।

2
@ মার্ক, দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ - আমি শেষ পর্যন্ত আত্মবিশ্বাসের সাথে আমার সিদ্ধান্ত নিতে পারি! স্পষ্টভাবে পরে আরও বিশদে ড্যাপারের দিকে তাকাবে। সত্যিই এটি কীভাবে কেবল একটি ফাইল হয় :)

3
আমি আমার নিজের ওআরএম লিখেছি। এটা ধীরগতির. আমি ড্যাপারের দিকে তাকিয়ে পছন্দ করেছি। এখন আমি আমার সমস্ত পড়ার জন্য ড্যাপার এবং সন্নিবেশগুলির জন্য আমার নিজের ওআরএম ব্যবহার করি (যা এফকে, লেনদেন এবং সমস্ত ভাল স্টাফ সমর্থন করে)। এটি আমার লেখা সবচেয়ে সহজতম পাঠযোগ্য কোড।

2
@ অ্যাসিডজম্বি 24 ড্যাপার লেনদেনকে সমর্থন করে এবং ড্যাপারের অবদান অংশ (ন্যুগেট ডিপ্লোয়ির অংশ নয়) সন্নিবেশ ইত্যাদির বিকল্পগুলি অর্জন করছে। সম্পূর্ণতার জন্য কেবল উল্লেখ করছি। আমি খুশি হলাম
মার্ক গ্র্যাভেল

1
@ নতুন নাম আমি কোনও বিষয়ে কখনও ভিডিও কোর্স করিনি; এখানে কিছু ভিডিও আছে, তবে আমার দ্বারা নয়। আমি একটি লিখিত শব্দ ব্যক্তি হতে ঝোঁক
মার্ক গ্র্যাভেল

217

বৃহত্তর অ্যাপ্লিকেশনটিতে সামগ্রিক ডেটা অ্যাক্সেস কৌশল এবং পারফরম্যান্স অপ্টিমাইজেশনের ক্ষেত্রে যখন প্রশ্নটি "কোন ওআরএম ব্যবহার করা উচিত" সত্যই একটি বিশাল আইসবার্গের ডগাটিকে লক্ষ্য করে।

নিম্নলিখিত সমস্ত জিনিস ( মোটামুটি গুরুত্বের ক্রমে) থ্রুপুটকে প্রভাবিত করতে চলেছে এবং সেগুলির বেশিরভাগগুলি ওআরএম ফ্রেমওয়ার্কগুলি বেশিরভাগের বাইরে পরিচালিত হয় (কখনও কখনও বিভিন্ন উপায়ে):

  1. ডাটাবেস ডিজাইন এবং রক্ষণাবেক্ষণ

    এটি একটি বিস্তৃত মার্জিন দ্বারা, ডেটা-চালিত অ্যাপ্লিকেশন বা ওয়েব সাইটের থ্রুপুটগুলির একক গুরুত্বপূর্ণ নির্ধারক এবং প্রায়শই প্রোগ্রামাররা একেবারে উপেক্ষা করে।

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

    আপনি যদি ডেটাবেস আপনাকে প্রদত্ত বৈশিষ্ট্যগুলির সদ্ব্যবহার না করেন যেমন পৃষ্ঠা সংক্ষেপণ, FILESTREAMস্টোরেজ (বাইনারি ডেটার জন্য), SPARSEকলামগুলি, hierarchyidশ্রেণিবিন্যাসের জন্য, এবং আরও (সমস্ত এসকিউএল সার্ভারের উদাহরণ), তবে আপনি আর কোথাও দেখতে পাবেন না কর্মক্ষমতা আপনি পারে এইজন্য হও।

    আপনি আপনার ডাটাবেসটি ডিজাইন করার পরে এবং নিজেকে নিশ্চিত করে নিন যে এটি সম্ভবত যতটা সম্ভব, কমপক্ষে আপাতত উপযুক্ত after

  2. আগ্রহী বনাম অলস লোড হচ্ছে

    বেশিরভাগ ওআরএম সম্পর্কের জন্য অলস লোডিং নামে একটি কৌশল ব্যবহার করে , যার অর্থ ডিফল্টরূপে এটি একবারে একটি সত্তা (টেবিলের সারি) লোড করবে এবং প্রতিবার এক বা একাধিক সম্পর্কিত (বিদেশী) লোড করার সময় ডাটাবেসে গোল-ভ্রমণ করবে foreign কী) সারি।

    এটি কোনও ভাল বা খারাপ জিনিস নয়, বরং এটি ডেটা দিয়ে আসলে কী করা হবে এবং আপনি কীভাবে সম্মুখভাগে জানেন তা নির্ভর করে। কখনও কখনও অলস-লোডিং করা একেবারে সঠিক জিনিস। উদাহরণস্বরূপ, এনহাইবারনেট কোনও কিছুর জন্য জিজ্ঞাসা না করার সিদ্ধান্ত নিতে পারে এবং নির্দিষ্ট আইডির জন্য কেবল একটি প্রক্সি তৈরি করতে পারে । আপনার যদি কখনও প্রয়োজন সমস্ত আইডি নিজেই হয় তবে কেন এটি আরও বেশি চাওয়া উচিত? অন্যদিকে, আপনি যদি 3-স্তরের শ্রেণিবিন্যাসে প্রতিটি একক উপাদানের একটি গাছ মুদ্রণের চেষ্টা করছেন, অলস-লোডিং একটি ও (N²) ক্রিয়ায় পরিণত হয়, যা কার্য সম্পাদনের জন্য অত্যন্ত খারাপ।

    "খাঁটি এসকিউএল" (যেমন কাঁচা ADO.NET কোয়েরি / সঞ্চিত পদ্ধতি) ব্যবহার করার একটি আকর্ষণীয় সুবিধা হ'ল এটি আপনাকে মূলত কোনও প্রদত্ত স্ক্রিন বা পৃষ্ঠা প্রদর্শন করার জন্য ঠিক কী ডেটা প্রয়োজন তা নিয়ে ভাবতে বাধ্য করে। ORMs এবং অলস লোড হচ্ছে বৈশিষ্ট্য না প্রতিরোধ এই কাজ থেকে, কিন্তু তারা না আপনি হতে ... ভাল, সুযোগ দিতে অলস , এবং ঘটনাক্রমে প্রশ্নের আপনি চালানো সংখ্যা বিস্ফোরিত করা। সুতরাং আপনাকে আপনার ওআরএম আগ্রহী-লোডিং বৈশিষ্ট্যগুলি বুঝতে হবে এবং যে কোনও প্রদত্ত পৃষ্ঠার অনুরোধের জন্য আপনি সার্ভারে যে কোয়েরি পাঠাচ্ছেন তার সংখ্যা সম্পর্কে সর্বদা সচেতন হন।

  3. ক্যাশিং

    সমস্ত বড় ওআরএম প্রথম স্তরের ক্যাশে বজায় রাখে, এ কেএ "আইডেন্টিটি ক্যাশে", যার অর্থ আপনি যদি একই আইডিটির আইডি দিয়ে দু'বার অনুরোধ করেন তবে এটির জন্য দ্বিতীয় রাউন্ড-ট্রিপের প্রয়োজন হবে না, এবং (যদি আপনি নিজের ডাটাবেসটি সঠিকভাবে ডিজাইন করেছেন) ) আপনাকে আশাবাদী সম্মতি ব্যবহার করার ক্ষমতা দেয়।

    এল 2 ক্যাশে এল 2 এস এবং ইএফ-তে বেশ অস্বচ্ছ, আপনার ধরণের বিশ্বাস রাখতে হবে যে এটি কাজ করছে। এনহাইবারনেট এটি সম্পর্কে ( Get/ Loadবনাম Query/ QueryOver) আরও সুস্পষ্ট । তবুও, যতক্ষণ সম্ভব আপনি আইডি দিয়ে যতটা সম্ভব ক্যোয়ারী করার চেষ্টা করবেন, আপনার এখানে ভাল হওয়া উচিত। অনেক লোক এল 1 ক্যাশে সম্পর্কে ভুলে যায় এবং বার বার একই সত্তাকে বার বার তার আইডি (অর্থাত্ একটি দেখার ক্ষেত্র) ব্যতীত অন্য কোনও কিছু দ্বারা সন্ধান করে। আপনার যদি এটি করতে হয় তবে ভবিষ্যত অনুসন্ধানের জন্য আপনার আইডি বা এমনকি পুরো সত্ত্বাটি সংরক্ষণ করা উচিত।

    এছাড়াও একটি স্তর 2 ক্যাশে ("ক্যোয়ারী ক্যাশে") রয়েছে। এনহাইবারনেটের এই বিল্ট-ইন রয়েছে। লিনক থেকে এসকিউএল এবং সত্তা ফ্রেমওয়ার্কে কোয়েরিগুলি সংকলিত হয়েছে , যা কোয়েরি এক্সপ্রেশন নিজেই সংকলন করে অ্যাপ্লিকেশন সার্ভারের লোডগুলি বেশ খানিকটা কমাতে সহায়তা করতে পারে তবে এটি ডেটা ক্যাশে করে না। মাইক্রোসফ্ট ডেটা-অ্যাক্সেস উদ্বেগের পরিবর্তে এটিকে একটি অ্যাপ্লিকেশন উদ্বেগ হিসাবে বিবেচনা করবে বলে মনে হয় এবং এটি এল 2 এস এবং ইএফ উভয়েরই একটি প্রধান দুর্বল বিষয়। এটি "কাঁচা" এসকিউএল এর একটি দুর্বল পয়েন্টও বলা বাহুল্য। মূলত এনএইচবারনেট ব্যতীত অন্য যে কোনও ওআরএমের সাথে সত্যিই ভাল পারফরম্যান্স পেতে আপনার নিজের ক্যাশিং ফ্যাক্যাড বাস্তবায়ন করতে হবে।

    EF4 এর জন্য একটি এল 2 ক্যাশে "এক্সটেনশন" রয়েছে যা ঠিক আছে তবে অ্যাপ্লিকেশন-স্তরের ক্যাশের জন্য কোনও পাইকারি প্রতিস্থাপন নয়।

  4. প্রশ্নের সংখ্যা

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

    আপনি কেবল একটি সারি প্রয়োজন হলে এখন আমি পুরো ডাটাবেসটি জিজ্ঞাসা করতে বলছি না। যদি আপনি প্রয়োজন, আমি কি বলছি হয় Customer, Address, Phone, CreditCard, এবং Orderএকটি পৃষ্ঠার পরিবেশন করার জন্য একই সময়ে সব সারি, তাহলে আপনি উচিত জিজ্ঞাসা , একই সময়ে তাদের সবার নির্ধারিত আলাদাভাবে প্রতিটি প্রশ্নের সাথে নির্বাহ না। কখনও কখনও এটি এর থেকেও খারাপ, আপনি এমন কোডটি দেখতে পাবেন যা একই Customerরেকর্ডটিতে পরপর 5 বার অনুসন্ধান করে, প্রথমে প্রথমে Id, তারপরে Name, তারপরে EmailAddress, তারপরে ... এটি হাস্যকরভাবে অক্ষম fficient

    এমনকি আপনার যদি এমন বেশ কয়েকটি ক্যুরিয়াস চালানোর প্রয়োজন হয় যা সমস্ত সম্পূর্ণ ডেটার সম্পূর্ণ সেটগুলিতে পরিচালিত হয় তবে এটি সাধারণত একক "স্ক্রিপ্ট" হিসাবে ডেটাবেজে প্রেরণ করা এবং এটি একাধিক ফলাফল সেটগুলি ফেরত দিতে আরও দক্ষ efficient এটি ওভারহেড যা আপনার সাথে উদ্বিগ্ন, ডেটার মোট পরিমাণ নয়।

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

    কিছু ফ্রেমওয়ার্ক - এবং আমি এখানে মূলত এনহাইবারনেটের কথা ভাবছি - এটি সম্পর্কে অবিশ্বাস্যভাবে চালাক এবং আপনাকে শেষ ভবিষ্যতের সম্ভাব্য মুহুর্তে ফিউচার নামক কিছু ব্যবহার করার অনুমতি দেয় যা পুরো প্রশ্নের সন্ধান করে এবং এগুলি একবারে কার্যকর করার চেষ্টা করে। আফাইক, আপনি নিজেরাই মাইক্রোসফ্ট প্রযুক্তিগুলির সাথে এটি করতে চাইলে; আপনার এটিকে আপনার অ্যাপ্লিকেশন যুক্তিতে তৈরি করতে হবে।

  5. সূচী, পূর্বাভাস এবং অনুমানগুলি

    কমপক্ষে 50% দেবের সাথে আমি কথা বলি এবং এমনকী কিছু ডিবিএর সূচকগুলি কভার করার ধারণাটিতেও সমস্যা রয়েছে বলে মনে হয়। তারা মনে করে, "ভাল, Customer.Nameকলামটি সূচিযুক্ত, তাই আমি নামটিতে যা করি প্রতিটি তাত্পর্য দ্রুত হওয়া উচিত" " আপনি যদি সন্ধান করছেন এমন নির্দিষ্ট কলামটি Nameসূচকটি কভার না করে এটি সেভাবে কাজ করে না । এসকিউএল সার্ভারে, INCLUDEএটি CREATE INDEXবিবৃতিতে সম্পন্ন হয়েছে।

    যদি আপনি নির্লিপ্তভাবে SELECT *সর্বত্র ব্যবহার করেন - এবং আপনি যদি অন্য কোনও প্রজেকশন ব্যবহার করে স্পষ্টভাবে নির্দিষ্ট না করেন তবে প্রতিটি ওআরএম আরও কম কি করবে - তবে ডিবিএমএস আপনার সূচিগুলি সম্পূর্ণ উপেক্ষা করা পছন্দ করতে পারে কারণ সেগুলিতে অন-আচ্ছাদিত কলাম রয়েছে। একটি অভিক্ষেপের অর্থ হ'ল উদাহরণস্বরূপ, এটি করার পরিবর্তে:

    from c in db.Customers where c.Name == "John Doe" select c
    

    পরিবর্তে আপনি এটি করুন:

    from c in db.Customers where c.Name == "John Doe"
    select new { c.Id, c.Name }
    

    আর এই ইচ্ছা অধিকাংশ আধুনিক ORMs জন্য, নির্দেশ এটি শুধুমাত্র যান এবং ক্যোয়ারীতে Idএবং Nameকলাম যা সম্ভবতঃ সূচক দ্বারা আচ্ছাদিত করা হয় (কিন্তু Email, LastActivityDateঅথবা যাই হোক না কেন অন্য কলাম তুমি সেখানে বিদ্ধ ঘটেছে)।

    অনুপযুক্ত ভবিষ্যদ্বাণীগুলি ব্যবহার করে কোনও সূচক সুবিধা পুরোপুরি উড়িয়ে দেওয়া খুব সহজ। উদাহরণ স্বরূপ:

    from c in db.Customers where c.Name.Contains("Doe")
    

    ... আমাদের আগের ক্যোয়ারীর সাথে প্রায় একইরকম দেখাচ্ছে তবে বাস্তবে একটি পূর্ণ টেবিল বা সূচি স্ক্যান হবে কারণ এটি অনুবাদ করে LIKE '%Doe%'। একইভাবে, সন্দেহজনকভাবে সহজ দেখাচ্ছে এমন আরও একটি ক্যোয়ারী হ'ল:

    from c in db.Customers where (maxDate == null) || (c.BirthDate >= maxDate)
    

    ধরে নিই যে আপনার একটি সূচক রয়েছে BirthDate, এই শিকারীর কাছে এটি সম্পূর্ণরূপে অকেজো রেন্ডার করার ভাল সুযোগ রয়েছে। এখানে আমাদের অনুমান প্রোগ্রামার স্পষ্টতই এক ধরণের গতিশীল ক্যোয়ারী তৈরি করার চেষ্টা করেছে ("শুধুমাত্র সেই জন্মের তারিখ ফিল্টার করে যদি সেই প্যারামিটারটি নির্দিষ্ট করা থাকে"), তবে এটি করার সঠিক উপায় এটি নয়। পরিবর্তে এইভাবে লেখা:

    from c in db.Customers where c.BirthDate >= (maxDate ?? DateTime.MinValue)
    

    ... এখন ডিবি ইঞ্জিন কীভাবে এটি প্যারামিটারাইজ করতে পারে এবং একটি সূচী অনুসন্ধান করতে পারে তা জানে। একটি নাবালিক্য, ক্যোয়ারী এক্সপ্রেশনটিতে আপাতদৃষ্টিতে তুচ্ছ পরিবর্তন পারফরম্যান্সকে মারাত্মকভাবে প্রভাবিত করতে পারে।

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

    মূলত এগুলি এই বিষয়টিতে নেমে আসে যে আপনাকে উত্পন্ন এসকিউএল এবং কার্যকর করার পরিকল্পনাগুলির উভয় দিকেই আপনাকে সত্যই নজর রাখতে হবে এবং যদি আপনি প্রত্যাশিত ফলাফল না পান তবে বাইপাস করতে ভয় পাবেন না ORM স্তরটি একবারে এসকিউএল হ্যান্ড-কোড করে। এটি কেবল EF নয়, কোনও ওআরএমের জন্য F

  6. লেনদেন এবং লকিং

    আপনি কি মিলিসেকেন্ড অবধি বর্তমান তথ্য প্রদর্শন করতে হবে? হতে পারে - এটি নির্ভর করে - তবে সম্ভবত না। দুঃখিতভাবে, সত্তা ফ্রেমওয়ার্ক আপনি দেয় নাnolock , আপনি শুধুমাত্র ব্যবহার করতে পারেন READ UNCOMMITTEDলেনদেন স্তর (না টেবিল স্তর)। বাস্তবে কোনও ওআরএমই বিশেষভাবে নির্ভরযোগ্য নয়; যদি আপনি নোংরা পাঠ করতে চান, আপনাকে এসকিউএল স্তরে নেমে অ্যাড-হক প্রশ্নগুলি বা সঞ্চিত পদ্ধতি লিখতে হবে। সুতরাং এটি আবার কীভাবে ফুটে ওঠে তা ফ্রেমওয়ার্কের মধ্যে এটি করা আপনার পক্ষে কত সহজ।

    সত্তা ফ্রেমওয়ার্ক এ বিষয়ে দীর্ঘ পথ পাড়ি দিয়েছে - EF এর 1 সংস্করণ (। নেট 3.5 এ) god শ্বর -ভয়ঙ্কর ছিল, "সত্তা" বিমূর্ততাটি ভেঙে ফেলতে অবিশ্বাস্যরকম কঠিন করে তুলেছিল , তবে এখন আপনি এক্সিকিউটিস্টোরকিউরি এবং অনুবাদ করেছেন , সুতরাং এটি সত্যই সত্য এতোটা খারাপ না. এই ছেলের সাথে বন্ধুত্ব করুন কারণ আপনি তাদের প্রচুর ব্যবহার করবেন।

    রাইটিং লকিং এবং ডেডলকগুলি এবং যতটা সম্ভব অল্প সময়ের জন্য ডাটাবেসে লক ধরে রাখার সাধারণ অনুশীলনের বিষয়টি রয়েছে। এই ক্ষেত্রে, বেশিরভাগ ওআরএম (এজেন্টি ফ্রেমওয়ার্ক সহ) আসলে কাঁচা এসকিউএল এর চেয়ে ভাল থাকে কারণ তারা কাজের প্যাটার্নের ইউনিটকে encapsulate করে , যা EF- এ সেভচেনজেস । অন্য কথায়, আপনি যখনই চাইবেন আপনার হার্টের বিষয়বস্তুগুলিতে "সন্নিবেশ" বা "আপডেট" বা "মুছুন" করতে পারেন, এই জ্ঞানটি সুরক্ষিত করুন যে আপনি কাজের এককটি প্রতিশ্রুতি না দেওয়া পর্যন্ত কোনও পরিবর্তন আসলেই ডাটাবেজে সঞ্চারিত হবে না।

    মনে রাখবেন যে একটি UW দীর্ঘমেয়াদি লেনদেনের সাথে সমান নয় । ইউউউউ এখনও ওআরএম এর আশাবাদী সম্মতিযুক্ত বৈশিষ্ট্যগুলি ব্যবহার করে এবং মেমরিতে সমস্ত পরিবর্তনগুলি ট্র্যাক করে । চূড়ান্ত প্রতিশ্রুতি না হওয়া পর্যন্ত একটিও ডিএমএল বিবৃতি বের হয় না। এটি লেনদেনের সময়গুলিকে যথাসম্ভব কম রাখে। যদি আপনি কাঁচা এসকিউএল ব্যবহার করে আপনার অ্যাপ্লিকেশনটি তৈরি করেন তবে এই স্থগিত আচরণ অর্জন করা বেশ কঠিন।

    EF- এর বিশেষত এর অর্থ কী: আপনার ইউনিটগুলিকে যতটা সম্ভব মোটা করে তুলুন এবং আপনার একেবারে প্রয়োজন না হওয়া পর্যন্ত এগুলি প্রতিশ্রুতিবদ্ধ করবেন না। এটি করুন এবং আপনি এলোমেলো সময়ে পৃথক ADO.NET কমান্ড ব্যবহার করার চেয়ে অনেক কম লক যুক্তি দিয়ে শেষ করবেন।

উপসংহারে:

উচ্চ ট্র্যাফিক / উচ্চ-পারফরম্যান্স অ্যাপ্লিকেশনগুলির জন্য EF সম্পূর্ণ জরিমানা, ঠিক যেমন উচ্চ ট্র্যাফিক / উচ্চ-কার্যকারিতা অ্যাপ্লিকেশনগুলির জন্য অন্যান্য প্রতিটি কাঠামো সূক্ষ্ম। আপনি কীভাবে এটি ব্যবহার করেন তা গুরুত্বপূর্ণ। এখানে সর্বাধিক জনপ্রিয় ফ্রেমওয়ার্কগুলির একটি দ্রুত তুলনা এবং পারফরম্যান্সের ক্ষেত্রে তারা কী বৈশিষ্ট্যগুলি উপস্থাপন করে (কিংবদন্তি: এন = সমর্থিত নয়, পি = আংশিক, ওয়াই = হ্যাঁ / সমর্থিত):

                                | L2S | EF1 | EF4 | NH3 | ADO
                                +-----+-----+-----+-----+-----
Lazy Loading (entities)         |  N  |  N  |  N  |  Y  |  N
Lazy Loading (relationships)    |  Y  |  Y  |  Y  |  Y  |  N
Eager Loading (global)          |  N  |  N  |  N  |  Y  |  N
Eager Loading (per-session)     |  Y  |  N  |  N  |  Y  |  N
Eager Loading (per-query)       |  N  |  Y  |  Y  |  Y  |  Y
Level 1 (Identity) Cache        |  Y  |  Y  |  Y  |  Y  |  N
Level 2 (Query) Cache           |  N  |  N  |  P  |  Y  |  N
Compiled Queries                |  Y  |  P  |  Y  |  N  | N/A
Multi-Queries                   |  N  |  N  |  N  |  Y  |  Y
Multiple Result Sets            |  Y  |  N  |  P  |  Y  |  Y
Futures                         |  N  |  N  |  N  |  Y  |  N
Explicit Locking (per-table)    |  N  |  N  |  N  |  P  |  Y
Transaction Isolation Level     |  Y  |  Y  |  Y  |  Y  |  Y
Ad-Hoc Queries                  |  Y  |  P  |  Y  |  Y  |  Y
Stored Procedures               |  Y  |  P  |  Y  |  Y  |  Y
Unit of Work                    |  Y  |  Y  |  Y  |  Y  |  N

আপনি দেখতে পাচ্ছেন, EF4 (বর্তমান সংস্করণ) খুব খারাপভাবে ভাড়া দেয় না, তবে পারফরম্যান্স যদি আপনার প্রাথমিক উদ্বেগ হয় তবে এটি সম্ভবত সেরা নয়। এনএইচবারনেট এই অঞ্চলে অনেক বেশি পরিপক্ক এবং এমনকি লিনক থেকে এসকিউএল এমন কিছু কর্মক্ষমতা-বাড়ানো বৈশিষ্ট্য সরবরাহ করে যা EF এখনও দেয় না। কাঁচা ADO.NET প্রায়শই খুব নির্দিষ্ট ডেটা অ্যাক্সেসের দৃশ্যের জন্য দ্রুত হতে চলেছে , তবে, আপনি যখন সমস্ত টুকরা একসাথে রাখেন তখন এটি বিভিন্ন কাঠামোগত দিক থেকে প্রাপ্ত অনেকগুলি গুরুত্বপূর্ণ বেনিফিট দেয় না।

এবং, কেবলমাত্র আমি ভাঙা রেকর্ডের মতোই আছি তা নিশ্চিত করার জন্য, আপনি যদি আপনার ডাটাবেস, অ্যাপ্লিকেশন এবং ডেটা অ্যাক্সেস কৌশলগুলি সঠিকভাবে ডিজাইন না করেন তবে এগুলির মধ্যে কোনওোটাই বিবেচ্য নয়। উপরের চার্টে থাকা সমস্ত আইটেমই বেসলাইন ছাড়িয়ে কর্মক্ষমতা উন্নত করার জন্য ; বেশিরভাগ সময়, বেসলাইন নিজেই সর্বাধিক উন্নতির প্রয়োজন।


38
কি দুর্দান্ত এবং ব্যাপক উত্তর!

2
+1 (আমি পারলে আরও বেশি করে) - আমি এখানে কিছুক্ষণের মধ্যে দেখেছি এমন সেরা উত্তরগুলির মধ্যে একটি এবং আমি একটি বা দুটি জিনিস শিখেছি - এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ!
ব্রোকেনগ্লাস

1
এটি দুর্দান্ত উত্তর এমনকি আমি উল্লিখিত সমস্ত কিছুতেই একমত নই। ওআরএম এর তুলনা করা সারণী সর্বদা সঠিক নয়। অলস লোডিং সত্তা কি? আপনি কি অলস বোঝা কলামগুলি বোঝাতে চান? এটি এল 2 এস-তে সমর্থিত। আপনি কী ভাবেন যে এনএইচ সংকলিত অনুসন্ধানগুলি সমর্থন করে না? আমি মনে করি নামের এইচকিউএল কোয়েরিগুলি প্রাক-সংকলিত হতে পারে। EF4 এর একাধিক ফলাফল সেটগুলির জন্য কোনও সমর্থন নেই।
লাডিস্লাভ শ্রীঙ্কা

11
আমাকে অযোগ্য "EF উচ্চ ট্র্যাফিক / উচ্চ-কার্যকারিতা অ্যাপ্লিকেশনগুলির জন্য পুরোপুরি ঠিক আছে" বিবৃতিটির সাথে দৃ strongly়ভাবে একমত হতে হবে , আমরা বারবার দেখেছি যে এটি ঘটেনি। এটা ঠিক যে, হয়তো আমরা কি "উচ্চ কর্মক্ষম" মানে অসম্মতি কিন্তু উদাহরণস্বরূপ 500 মিঃসে নিচে ওয়েব পেজ নিখুঁত এবং 400 মিঃসে যে + + ফ্রেমওয়ার্ক ভিতরে অস্বাভাবিক অতিবাহিত থাকার (এবং শুধুমাত্র 10ms আসলে আঘাত এসকিউএল) কিছু পরিস্থিতিতে জন্য "জরিমানা" নয়, এটি আমাদের দেব দলের পক্ষে একেবারেই অগ্রহণযোগ্য।
নিক ক্র্যাভার

1
EF এর ফিউচার সম্পর্কে সাধারণ নোট। এগুলি আনুষ্ঠানিকভাবে এমএস ইএফ দল সরবরাহ করে না তবে তৃতীয় পক্ষের প্রকল্পগুলির মাধ্যমে অর্জন করা যেতে পারে যা ভবিষ্যত <> এক্সটেনশনগুলি আইকোয়ারিযোগ্য <> কে সংজ্ঞায়িত করে। উদাহরণস্বরূপ, অ্যান্টিটি ফ্রেমওয়ার্ক L লোরসফট দ্বারা বর্ধিত, নিউগেটে উপলভ্য। ফিউচারটি ব্যবহার করে একক ব্যাচে কয়েক ডজন অ-নির্ভরশীল কোয়েরিগুলিকে প্যাক করার সময় উত্পাদন অ্যাপ্লিকেশনগুলিতে আমার ব্যক্তিগত পরীক্ষাগুলি 10x পর্যন্ত পারফরম্যান্স লাভ দেখায় (সমস্ত কোয়ালিটির সমান্তরালভাবে কার্যকর করা যেতে পারে, কারও আগেরটির ফলাফলের প্রয়োজন হয় না) a এছাড়াও আসনো ট্র্যাকিং () কেবল প্রচুর রেকর্ড পড়ে, পরে কোনও আপডেট না করে পারফরম্যান্সকে অনেক উন্নত করে।
ডেভিড অলিভান উবিয়াতো

38

সম্পাদনা: @ অ্যারনোনাট দুর্দান্ত উত্তরের উপর ভিত্তি করে আমি ইএফের সাথে লক্ষ্যবস্তুতে কয়েকটি পয়েন্ট যুক্ত করছি। এই নতুন পয়েন্টগুলি সম্পাদনা দ্বারা উপসর্গ করা হয়।


উচ্চ ট্র্যাফিক ওয়েবসাইটগুলিতে পারফরম্যান্সের সর্বাধিক উন্নতি ক্যাচিংয়ের মাধ্যমে অর্জন করা হয় (= প্রথমত কোনও ওয়েব সার্ভার প্রসেসিং বা ডাটাবেস অনুসন্ধান এড়িয়ে যাওয়া) তারপরে ডাটাবেস অনুসন্ধানগুলি সঞ্চালনের সময় থ্রেড ব্লকিং এড়ানোর জন্য অ্যাসিনক্রোনাস প্রসেসিং করা হয়।

আপনার প্রশ্নের কোনও বুলেট প্রমাণের উত্তর নেই কারণ এটি সর্বদা প্রয়োগের প্রয়োজনীয়তার উপর এবং প্রশ্নের জটিলতার উপর নির্ভর করে। সত্যটি হ'ল ইএফ সহ বিকাশকারী উত্পাদনশীলতা জটিলতা আড়াল করে যার পিছনে অনেক ক্ষেত্রে EF এর ভুল ব্যবহার এবং ভয়ানক কার্যকারিতা দেখা দেয় leads আপনি ডেটা অ্যাক্সেসের জন্য উচ্চ স্তরের বিমূর্ত ইন্টারফেসটি প্রকাশ করতে পারেন এবং এটি সব ক্ষেত্রে কার্যকরভাবে কাজ করবে এই ধারণাটি কার্যকর হয় না। এমনকি ওআরএম দিয়ে আপনাকে অবশ্যই জেনে রাখা উচিত যে বিমূর্তনের পিছনে কী ঘটছে এবং কীভাবে এটি সঠিকভাবে ব্যবহার করতে হয়।

EF এর সাথে পূর্ব অভিজ্ঞতা না থাকলে পারফরম্যান্সের সাথে ডিল করার সময় আপনি অনেক চ্যালেঞ্জের মুখোমুখি হবেন। ADO.NET এর সাথে তুলনা করে EF এর সাথে কাজ করার সময় আপনি আরও অনেক ভুল করতে পারেন। এছাড়াও ইএফ-তে প্রচুর অতিরিক্ত প্রক্রিয়াজাতকরণ করা হয়, সুতরাং EF সর্বদা নেটিভ ADO.NET এর তুলনায় উল্লেখযোগ্যভাবে ধীর হবে - এটি এমন ধারণা যা আপনি ধারণার প্রয়োগের সহজ প্রমাণ দ্বারা মাপতে পারেন।

আপনি যদি ইএফ থেকে সেরা অভিনয় পেতে চান তবে আপনাকে সম্ভবত সম্ভবত:

  • এসকিউএল প্রোফাইলারের সাহায্যে আপনার ডেটা অ্যাক্সেসটি খুব সাবধানতার সাথে সংশোধন করুন এবং লিনক-টু-অবজেক্টের পরিবর্তে যদি লিনক-টু-সত্তা সঠিকভাবে ব্যবহার করেন তবে আপনার লিনকুই কোয়েরিগুলি পর্যালোচনা করুন
  • উন্নত EF অপ্টিমাইজেশন বৈশিষ্ট্যগুলি খুব সাবধানে ব্যবহার করুন MergeOption.NoTracking
  • কিছু ক্ষেত্রে ESQL ব্যবহার করুন
  • প্রাক-সংকলন অনুসন্ধানগুলি যা প্রায়শই সম্পাদিত হয়
  • কিছু প্রশ্নের জন্য "দ্বিতীয় স্তরের ক্যাশে" এর মতো বৈশিষ্ট্য পেতে ইএফ ক্যাচিং মোড়কের সুবিধা নেওয়ার বিষয়ে চিন্তা করুন
  • প্রায়শই ব্যবহৃত অভিক্ষেপ বা সংহতকরণের জন্য কিছু দৃশ্যে এসকিউএল ভিউ বা কাস্টম ম্যাপযুক্ত এসকিউএল কোয়েরিগুলি (EDMX ফাইলের ম্যানুয়াল রক্ষণাবেক্ষণের প্রয়োজন) ব্যবহার করুন যা কার্য সম্পাদনের উন্নতি প্রয়োজন
  • কিছু প্রশ্নের জন্য নেটিভ এসকিউএল এবং সঞ্চিত পদ্ধতি ব্যবহার করুন যা লিনক বা ইএসকিউএল সংজ্ঞায়িত করার সময় পর্যাপ্ত কর্মক্ষমতা সরবরাহ করে না
  • সম্পাদনা: সাবধানতার সাথে ক্যোরিগুলি ব্যবহার করুন - প্রতিটি ক্যোয়ারী ডেটাবেজে আলাদা রাউন্ডট্রিপ তৈরি করে। EFv4 এর কোনও কোয়েরি ব্যাচিং নেই কারণ এটি সম্পাদিত ডাটাবেস কমান্ডের জন্য একাধিক ফলাফল সেট ব্যবহার করতে সক্ষম নয়। EFv4.5 ম্যাপযুক্ত স্টোরেজ পদ্ধতিগুলির জন্য একাধিক ফলাফল সেটগুলিকে সমর্থন করবে।
  • সম্পাদনা করুন: ডেটা পরিবর্তনগুলির সাথে সাবধানতার সাথে কাজ করুন । আবার EF- এ সম্পূর্ণ কমান্ড ব্যাচিংয়ের অভাব রয়েছে । সুতরাং ADO.NET এ আপনি SqlCommandএকাধিক সন্নিবেশ, আপডেটগুলি বা মুছে ফেলা সমন্বিত একক ব্যবহার করতে পারেন তবে EF এর সাথে প্রতিটি কমান্ড পৃথক রাউন্ডট্রাইপে ডাটাবেসে কার্যকর করা হবে।
  • সম্পাদনা: পরিচয় মানচিত্র / পরিচয় ক্যাশে সাবধানতার সাথে কাজ করুন । প্রথমে ক্যাশে ক্যোয়ারী করার জন্য EF এর একটি বিশেষ পদ্ধতি রয়েছে ( GetByKeyঅবজেক্টকন্টেক্সট এপিআই বা FindDbContext API এ)। আপনি যদি লিনক-টু-সত্তা বা ইএসকিউএল ব্যবহার করেন তবে এটি ডাটাবেজে রাউন্ডট্রিপ তৈরি করবে এবং এরপরে এটি ক্যাশে থেকে বিদ্যমান উদাহরণটি ফিরিয়ে আনবে।
  • সম্পাদনা করুন: আগ্রহী লোডিং সাবধানতার সাথে ব্যবহার করুন । এটি সর্বদা উইন-উইন সলিউশন হয় না কারণ এটি একটি বিশাল ডেটাसेट তৈরি করে । আপনি দেখতে পাচ্ছেন এটি অনেক অতিরিক্ত জটিলতা এবং এটিই পুরো বিষয়টি। ওআরএম ম্যাপিং এবং ম্যাটেরিয়ালাইজেশনকে সহজ করে তোলে তবে পারফরম্যান্সের সাথে কাজ করার সময় এটি আরও জটিল করে তুলবে এবং আপনাকে ট্রেড-অফ করতে হবে।

আমি নিশ্চিত না যে এসও এখনও এল 2 এস ব্যবহার করছে কিনা। তারা ড্যাপার নামে একটি নতুন ওপেন সোর্স ওআরএম তৈরি করেছে এবং আমি মনে করি যে এই বিকাশের মূল বিষয়টি ছিল কর্মক্ষমতা বৃদ্ধি করা।


লাডিসালভ, এটি সত্যিই সহায়ক একটি উত্তর। এই প্রথম আমি ড্যাপার (এবং ফলস্বরূপ পেটাপোকো, ম্যাসিভ) সম্পর্কে শুনেছি - এবং এটি একটি আকর্ষণীয় ধারণা বলে মনে হচ্ছে।

1
এসও এখন এসকিউএল এবং ডাপারের সাথে লিনকিউয়ের মিশ্রণটি ব্যবহার করছে বলে মনে হচ্ছে: samsaffron.com/archive/2011/03/30/… উদ্ধৃতি: "আমরা একটি নির্দিষ্ট সমস্যার জন্য আমাদের নতুন

5
@ স্লোমা ভাল, মাস কয়েক আগে এটি একটি বিবৃতি, সাধারণভাবে এসও সম্পর্কিত সমস্ত নতুন কাজ দাপ্পারে সম্পন্ন হয়, উদাহরণস্বরূপ আমি আজ যে নতুন টেবিলটি যুক্ত করেছি তা এমনকি ডিবিএমএল ফাইলে নেই।
স্যাম জাফরন

1
@ সাম: এসও-তে বর্তমান ডেটা অ্যাক্সেস কৌশল সম্পর্কে কোনও নতুন ব্লগ পোস্ট আছে? হতে চান খুব আকর্ষণীয়! এর মধ্যে কি ড্যাপারকে বাড়ানো হয়েছে? আমার বোঝার ছিল ড্যাপার সম্পূর্ণ ORM, সম্পর্ক কোন সমর্থন নয় - এবং কি আপডেট, টিপে, মোছা হয়, লেনদেন, পরিবর্তন ট্র্যাকিং, ইত্যাদি সম্পর্কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.