দ্রষ্টব্য: সত্তা ফ্রেমওয়ার্ক 4 আসল হওয়ার সময় আমি এই উত্তরটি লিখেছিলাম। এই উত্তরটির বিন্দুটি ছিল তুচ্ছ .Any()
বনাম .Count()
পারফরম্যান্স পরীক্ষার দিকে যাওয়া। পয়েন্টটি ইঙ্গিত দেয় যে EF নিখুঁত থেকে অনেক দূরে। নবীনতর সংস্করণ আরও ভাল হয় ... কিন্তু আপনি কোড যে স্লো এর অংশ আছে এবং এটি সরাসরি TSQL সঙ্গে মতিন পরীক্ষা ব্যবহার করে এবং অনুমানের ওপর নির্ভর (যে বদলে কর্মক্ষমতা তুলনা যদি .Any()
সর্বদা যতো তাড়াতাড়ি .Count() > 0
)।
যদিও আমি বেশিরভাগ আপ-ভোট দেওয়া উত্তর এবং মন্তব্যের সাথে একমত হই - বিশেষত পয়েন্ট Any
সিগন্যালের বিকাশকারী অভিপ্রায়র চেয়ে ভাল Count() > 0
- আমার এমন পরিস্থিতি হয়েছিল যার মধ্যে এসকিউএল সার্ভারের (এনটিটি ফ্রেমওয়ার্ক 4) পরিমাপের মাধ্যমে গণনা দ্রুততর হয়।
এখানে সেই নতুন Any
সময়সীমা ব্যতিক্রম (~ 200.000 রেকর্ডে) এর সাথে প্রশ্নটি রয়েছে :
con = db.Contacts.
Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
&& !a.NewsletterLogs.Any(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr)
).OrderBy(a => a.ContactId).
Skip(position - 1).
Take(1).FirstOrDefault();
Count
মিলিসেকেন্ডের ক্ষেত্রে কার্যকর সংস্করণ:
con = db.Contacts.
Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
&& a.NewsletterLogs.Count(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr) == 0
).OrderBy(a => a.ContactId).
Skip(position - 1).
Take(1).FirstOrDefault();
উভয় লিনকুইগুলি কী সঠিক এসকিউএল উত্পাদন করে তা দেখার জন্য আমাকে একটি উপায় খুঁজে বের করতে হবে - তবে এটি স্পষ্টতই রয়েছে যে কিছু ক্ষেত্রে Count
এবং এর Any
মধ্যে একটি বিশাল পারফরম্যান্স পার্থক্য রয়েছে এবং দুর্ভাগ্যক্রমে মনে হয় আপনি কেবলমাত্র Any
সব ক্ষেত্রেই আটকে থাকতে পারবেন না ।
সম্পাদনা: এখানে এসকিউএল উত্পন্ন হয়। সুন্দরীদের আপনি দেখতে পারেন হিসাবে;)
ANY
:
নির্বাহী sp_executesql এন 'শীর্ষ শীর্ষ (1)
[প্রকল্প 2]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি],
[প্রকল্প 2]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি],
[প্রকল্প 2]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম],
[প্রজেক্ট ২] [[পূর্ণ নাম] এএস [পূর্ণ নাম],
[প্রজেক্ট ২]
[প্রকল্প 2]। [তৈরি করা] এএস [তৈরি]
থেকে (নির্বাচন করুন [প্রকল্প ২]। [যোগাযোগ আইডি] এএস [পরিচিতি আইডি], [প্রকল্প ২]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], [প্রকল্প ২]। [যোগাযোগনাম] এএস [পরিচিতি নাম], [প্রজেক্ট ২]। [ফুলনাম] এএস [পূর্ণ নাম] , [প্রজেক্ট ২]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি], [প্রজেক্ট ২]। [তৈরি] এএস [সৃজিত], সারি_নম্বার () ওভার (অর্ডার দ্বারা [প্রজেক্ট ২]। [যোগাযোগ আইডি] এএসসি) এএস [সারি_ সংখ্যা]
FROM (নির্বাচন করুন)
[এক্সটেন্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি],
[এক্সটেন্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি],
[এক্সটেন্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম],
[এক্সটেন্ট 1]। [পুরো নাম] এএস [পূর্ণ নাম],
[এক্সটেন্ট ১]
[এক্সটেন্ট 1]। [তৈরি] এএস [তৈরি]
[ডিবিও] থেকে। [যোগাযোগ করুন] এএস [এক্সটেন্ট 1]
যেখানে ([এক্সটেন্ট 1]। [কোম্পানীআইডি] = @ পি__লিঙ্ক__0) এবং এবং ([এক্সটেন্ট 1]। [যোগাযোগ স্ট্যাটাসআইড] <= 3) এবং (অস্তিত্ব নেই (নির্বাচন করুন
1 এএস [সি 1]
থেকে [ডিবিও]। [নিউজলেটার লগ] এএস [এক্সটেন্ট 2]
যেখানে ([এক্সটেন্ট 1]। [যোগাযোগ আইডি] = [এক্সটেন্ট 2]। [যোগাযোগ আইড]) এবং (6 = [এক্সটেন্ট 2]। [নিউজলেটার লগ টাইপআইডি])
))
) এএস [প্রকল্প 2]
) এএস [প্রকল্প 2]
যেখানে [প্রকল্প 2]। [সারি_সংখ্যা]> 99
অর্ডার [প্রজেক্ট 2]। [যোগাযোগ আইডি] এএসসি ', এন' @ পি__লিনিক__0 ইনট ', @ পি__লিংক__0 = 4
COUNT
:
নির্বাহী sp_executesql এন 'শীর্ষ শীর্ষ (1)
[প্রকল্প 2]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি],
[প্রকল্প 2]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি],
[প্রকল্প 2]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম],
[প্রজেক্ট ২] [[পূর্ণ নাম] এএস [পূর্ণ নাম],
[প্রজেক্ট ২]
[প্রকল্প 2]। [তৈরি করা] এএস [তৈরি]
থেকে (নির্বাচন করুন [প্রকল্প ২]। [যোগাযোগ আইডি] এএস [পরিচিতি আইডি], [প্রকল্প ২]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], [প্রকল্প ২]। [যোগাযোগনাম] এএস [পরিচিতি নাম], [প্রজেক্ট ২]। [ফুলনাম] এএস [পূর্ণ নাম] , [প্রজেক্ট ২]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি], [প্রজেক্ট ২]। [তৈরি] এএস [সৃজিত], সারি_নম্বার () ওভার (অর্ডার দ্বারা [প্রজেক্ট ২]। [যোগাযোগ আইডি] এএসসি) এএস [সারি_ সংখ্যা]
FROM (নির্বাচন করুন)
[প্রজেক্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি],
[প্রজেক্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি],
[প্রজেক্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম],
[প্রজেক্ট 1]। [পুরো নাম] এএস [পুরো নাম],
[প্রজেক্ট 1]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি],
[প্রকল্প 1]। [তৈরি করা] এএস [তৈরি]
FROM (নির্বাচন করুন)
[এক্সটেন্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি],
[এক্সটেন্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি],
[এক্সটেন্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম],
[এক্সটেন্ট 1]। [পুরো নাম] এএস [পূর্ণ নাম],
[এক্সটেন্ট ১]
[এক্সটেন্ট 1]। [তৈরি করা] এএস [তৈরি],
(নির্বাচন
COUNT (1) এএস [এ 1]
থেকে [ডিবিও]। [নিউজলেটার লগ] এএস [এক্সটেন্ট 2]
যেখানে ([এক্সটেন্ট 1]। [যোগাযোগ আইডি] = [এক্সটেন্ট 2]। [যোগাযোগ আইড]) এবং (6 = [এক্সটেন্ট 2]। [নিউজলেটার লগটাইপআইডি])) এএস [সি 1]
[ডিবিও] থেকে। [যোগাযোগ করুন] এএস [এক্সটেন্ট 1]
) এএস [প্রকল্প 1]
যেখানে ([প্রজেক্ট 1]। [কোম্পানীআইডি] = @ পি__লিন্ক__0) এবং ((প্রকল্প 1]
) এএস [প্রকল্প 2]
) এএস [প্রকল্প 2]
যেখানে [প্রকল্প 2]। [সারি_সংখ্যা]> 99
অর্ডার [প্রজেক্ট 2]। [যোগাযোগ আইডি] এএসসি ', এন' @ পি__লিনিক__0 ইনট ', @ পি__লিংক__0 = 4
বিশুদ্ধ বলে মনে হয় যেখানে উপস্থিতের সাথে গণনা গণনা করা এবং তারপরে গণনার সাথে == 0 করার চেয়ে খারাপ কাজ করে।
আপনারা যদি আমার অনুসন্ধানে কিছু ত্রুটি দেখতে পান তবে আমাকে জানান। বনাম গণনা আলোচনার বিষয়টি বিবেচনা না করেই এই সমস্ত কিসের বাইরে নেওয়া যায় তা হ'ল স্টোরড পদ্ধতি হিসাবে পুনরায় লেখার সময় আরও জটিল লিনকিউ আরও ভাল হয়))।