সত্তা ফ্রেমওয়ার্ক কোয়েরি ধীর, তবে এসকিউএলকিউরিতে একই এসকিউএল দ্রুত


95

.NET ফ্রেমওয়ার্ক সংস্করণ 4 সহ এনটিটি ফ্রেমওয়ার্ক কোড-ফার্স্ট ব্যবহার করে খুব সাধারণ ক্যোয়ারির সাথে সম্পর্কিত কিছু সত্যই অদ্ভুত পারফেকশন দেখছি 4.. লাইনকিউ 2 এন্টিটিস কোয়েরিটি এর মতো দেখাচ্ছে:

 context.MyTables.Where(m => m.SomeStringProp == stringVar);

এটি কার্যকর করতে 3000 মিলিসেকেন্ডের বেশি সময় নেয়। উত্পন্ন এসকিউএল দেখতে খুব সহজ দেখাচ্ছে:

 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
 ...
 FROM [MyTable] as [Extent1]
 WHERE [Extent1].[SomeStringProp] = '1234567890'

ম্যানেজমেন্ট স্টুডিওতে চলাকালীন এই কোয়েরিটি প্রায় তাত্ক্ষণিকভাবে চলে। যখন আমি স্ক্লিকুয়েরি ফাংশনটি ব্যবহার করতে সি # কোড পরিবর্তন করি তখন এটি 5-10 মিলি সেকেন্ডে চলে:

 context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);

সুতরাং, ঠিক একই এসকিউএল, ফলস্বরূপ সত্তা উভয় ক্ষেত্রেই পরিবর্তন-ট্র্যাক করা হয়েছে, তবে দুজনের মধ্যে বুনো পার্থক্য রয়েছে। শেষ ঘন্টা?


4
আমি আশা করি আপনি প্রারম্ভিক বিলম্ব দেখতে পাচ্ছেন - সম্ভবত সংকলনটি দেখুন। এমএসডিএন দেখুন:Performance Considerations for Entity Framework 5
নিকোলাস বাটলার

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

4
@মার্ক_স - না, এসকিউএলকিউরি একটি সম্পূর্ণ-পদার্থযুক্ত এবং পরিবর্তন-ট্র্যাক করা সত্তার উদাহরণটি ফিরিয়ে দেবে। এমএসডিএন.মাইক্রোসফটকম
ব্রায়ান সুলিভান

আপনার EF ক্যোয়ারির জন্য উত্পন্ন এসকিউএল আসলে প্যারামিটার মানটি ইনলাইন করছে, বা কোনও পরামিতি ব্যবহার করছে? এটি পৃথক প্রশ্নের জন্য ক্যোয়ারী গতিকে প্রভাবিত করবে না, তবে সময়ের সাথে সাথে সার্ভারে কোয়েরিপ্ল্যান ফোলাতে পারে cause
জিম উওলি

আপনি কি একই প্রশ্নটি দু'বার / একাধিকবার চালানোর চেষ্টা করেছেন? দ্বিতীয়বার দৌড়াতে কতক্ষণ সময় লেগেছিল? আপনি নেট নেট ফ্রেমওয়ার্ক 4.5 এ চেষ্টা করে দেখেছেন - নেট ফ্রেমওয়ার্ক 4.5 তে কিছু ইএফ সম্পর্কিত পারফেক্ট উন্নতি রয়েছে যা সহায়তা করতে পারে।
পাভেল

উত্তর:


97

এটি পেয়েছি। দেখা যাচ্ছে এটি এসকিউএল ডেটা প্রকারের একটি সমস্যা। SomeStringPropডাটাবেসের মধ্যে কলামটি একটি varchar ছিল, কিন্তু মতিন ধরে নেয় যে .NET স্ট্রিং ধরনের nvarchars হয়। ডিবি তুলনা করতে ক্যোয়ারির সময় ফলাফল অনুবাদ প্রক্রিয়াটি হ'ল দীর্ঘ সময় লাগে takes আমি মনে করি ইএফ প্রফেসর আমাকে এখানে কিছুটা পথভ্রষ্ট করছে, ক্যোয়ারী চালানো হচ্ছে তার আরও সঠিক প্রতিনিধিত্ব নিম্নরূপ হবে:

 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
 ...
 FROM [MyTable] as [Extent1]
 WHERE [Extent1].[SomeStringProp] = N'1234567890'

সুতরাং ফলাফলটি সংশোধন করা হচ্ছে কোড-প্রথম মডেলটি বর্ননা করা, সঠিক এসকিউএল ডেটা টাইপ নির্দেশ করে:

public class MyTable
{
    ...

    [Column(TypeName="varchar")]
    public string SomeStringProp { get; set; }

    ...
}

4
ভাল তদন্ত। আপনার ক্যোয়ারী, "অন্তর্নিহিত রূপান্তর" ভুগছিলেন যেমন এখানে ব্যাখ্যা করা হয়: brentozar.com/archive/2012/07/...
জেইমি

আমাকে ডিবাগিংয়ের কয়েক ঘন্টা বাঁচিয়েছে। ঠিক এই সমস্যা ছিল।
কোডি

4
আমার ক্ষেত্রে, আমি একটি উত্তরাধিকার ডাটাবেস সহ EDMX ব্যবহার করছি, যা varcharসমস্ত কিছুর জন্য ব্যবহার করে, এবং প্রকৃতপক্ষে এটিই সমস্যা ছিল। আমি ভাবছি যদি আমি স্ট্রিং কলামের জন্য ভারচার বিবেচনা করতে কোনও EDMX করতে পারি।
অ্যালিসন

4
দারুণ সন্ধানকারী মানুষ। তবে @ জাইম, ডেটাবেস থেকে ইএফ মডেলটি আপডেট করার পরে ডাটাবেসটির জন্য প্রথমে আমাদের কী করা উচিত (যেমন ডিবি মডেলের ডেটা টিকা) মুছে ফেলা হয়।
নওমন খান

এটিকে কিছুক্ষণের জন্য আমার হোম পৃষ্ঠা হিসাবে সেট করা যাতে আমি আরও একটি দুর্দান্ত উত্তরটি খুঁজে পাওয়ার উত্তেজনাকে কিছুক্ষণের জন্য পুনরুদ্ধার করতে পারি। ধন্যবাদ!!!
ওজিসবাদ

44

ইএফ-তে তৈরি করা আমার প্রশ্নগুলিকে ধীর করার কারণটি হ'ল স্ক্যালারকে অযোগ্য স্ক্যালারের সাথে তুলনা করছিল:

long? userId = 10; // nullable scalar

db.Table<Document>().Where(x => x.User.Id == userId).ToList() // or userId.Value
                                ^^^^^^^^^    ^^^^^^
                                Type: long   Type: long?

এই জিজ্ঞাসাটি 35 সেকেন্ড সময় নিয়েছে। তবে এর মতো একটি ছোট্ট রিফ্যাক্টরিং:

long? userId = 10;
long userIdValue = userId.Value; // I've done that only for the presentation pursposes

db.Table<Document>().Where(x => x.User.Id == userIdValue).ToList()
                                ^^^^^^^^^    ^^^^^^^^^^^
                                Type: long   Type: long

অবিশ্বাস্য ফলাফল দেয়। এটি সম্পূর্ণ হতে 50 মিমি সময় নিয়েছিল। এটি সম্ভবত এটিএফ-তে একটি বাগ।


13
এটি এত অদ্ভুত
ড্যানিয়েল কার্ডেনাস

4
ঈশ্বর. স্পষ্টতই IUserId.Id ইন্টারফেসগুলি ব্যবহার করার সময়ও এটি ঘটতে পারে যখন আমার সাথে সমস্যা দেখা দিচ্ছিল তবে প্রথম সংখ্যায় আইডি ম্যাপিং কাজ করে ... আমার 100.000 লাইনের অ্যাপ্লিকেশনটিতে এখন আমাকে কী সমস্ত প্রশ্নগুলি পরীক্ষা করতে হবে?
ডার্ক বোয়ার

এই বাগ রিপোর্ট করা হয়েছে? এটি এখনও সর্বশেষতম সংস্করণ 6.২.০
ডার্ক বোয়ার

4
একই ইস্যুটি ইএফ কোর-এও রয়েছে। এটি সন্ধানের জন্য ধন্যবাদ!
ইয়্যানিকভ

অন্য একটি পরামর্শ হ'ল লিনকিউ এক্সপ্রেশনে রাখার আগে পরিবর্তনশীলটি প্রক্রিয়া করা। অন্যথায় উত্পন্ন স্কয়ারটি আরও দীর্ঘ এবং ধীর হবে। আমি লিনকিউ এক্সপ্রেশনটির ভিতরে ট্রিম () এবং টোলওয়ার () রাখার সময় অভিজ্ঞতা পেয়েছিলাম যা আমাকে জাগিয়ে তোলে।
সামিহেই


4

আমার একই সমস্যা ছিল (এসকিউএল পরিচালকের কাছ থেকে কার্যকর করার সময় ক্যোয়ারীটি দ্রুত) তবে EF থেকে কার্যকর হলে সময়সীমা শেষ হয়।

দেখা যাচ্ছে যে সত্তার (যা দেখা থেকে তৈরি করা হয়েছিল) ভুল সত্তা কী রয়েছে। সুতরাং সত্তাটির একই কীগুলির সাথে সদৃশ সারি ছিল এবং আমি অনুমান করি যে এটি ব্যাকগ্রাউন্ডে গ্রুপিং করতে হয়েছিল।


3

আমি একটি জটিল ইফের ক্যোরিও নিয়ে এসেছি। আমার জন্য একটি স্থিরতা যা এটি তৈরি করে দ্বিতীয় দ্বিতীয় বর্গ কোয়েরিতে 6 সেকেন্ডের ef ক্যোয়ারী হ্রাস করেছিল তা হচ্ছে অলস লোডিং বন্ধ করা।

এই সেটিংটি খুঁজে পেতে (ef 6) .edmx ফাইলে যান এবং বৈশিষ্ট্যগুলি -> কোড তৈরি -> অলস লোডিং সক্ষম abled মিথ্যাতে সেট করুন।

আমার জন্য পারফরম্যান্সে ব্যাপক উন্নতি।


4
এটি দুর্দান্ত, তবে পোস্টারগুলির প্রশ্নের সাথে কিছু করার নেই।
জেস রিয়া

2

আমি ভাল হিসাবে এই সমস্যা ছিল। এটি আমার ক্ষেত্রে দোষীটি হ'ল এসকিউএল-সার্ভারের প্যারামিটার স্মিফিং

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

আমি কোয়েরির জন্য ক্যোয়ারী প্ল্যান ক্যাচিং অক্ষম করেছিলাম, আপনি এখানে সমাধান পেতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.