إطار الكيان: الاستعلام تنفيذ "اختر من" دون سبب

StackOverflow https://stackoverflow.com/questions/2241656

  •  19-09-2019
  •  | 
  •  

سؤال

أواجه بعض القضايا مع إطار الكيان. أنا أعمل اختيار بسيط من وجهة نظر في قاعدة البيانات. ومع ذلك، عندما أعرض SQL الذي يولد EF، فإنه ينفذ الاستعلام مرتين باستخدام تحديد من. هل هذه هي الطريقة التي من المفترض أن تعمل بها؟ يبدو غير فعال للغاية.

var reads = (from rt in ctx.C2kReadsToTransfer
                     where rt.ReadDt > fromDate
                     && rt.ReadDt < toDate
                     select rt);

يتم ترجمة هذا إلى SQL التالي

SELECT 

 [Extent1].[AMRID] AS [AMRID]
 , [Extent1].[Comments] AS [Comments]
 , [Extent1].[ExternalSystemType] AS [ExternalSystemType]
 , [Extent1].[LastReadDt] AS [LastReadDt]
 , [Extent1].[ReadDt] AS [ReadDt]
 , [Extent1].[Reading] AS [Reading]
 , [Extent1].[Units] AS [Units]
 , [Extent1].[Transferred] AS [Transferred]



 FROM 
     (SELECT 
      [ReadsToTransfer].[AMRID] AS [AMRID]
      , [ReadsToTransfer].[Comments] AS [Comments]
      , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType]
      , [ReadsToTransfer].[LastReadDt] AS [LastReadDt]
      , [ReadsToTransfer].[ReadDt] AS [ReadDt]
      , [ReadsToTransfer].[Reading] AS [Reading]
      , [ReadsToTransfer].[Transferred] AS [Transferred]
      , [ReadsToTransfer].[Units] AS [Units]
      FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer])
    AS [Extent1]

يبدو أن هذا غير فعال للغاية، خاصة عندما يحتوي الجدول على ما يقرب من 250 مليون صف كما يفعلنا. أيضا، إذا قمت بتسجيل .take (2000) على نهاية التعليمات البرمجية، فسيطر ببساطة على "تحديد أعلى 2000" فقط في أول تحديد. وبالتالي، يمكنك اختيار أعلى 2000 من الداخل المختار الذي هو الجدول بأكمله.

اي افكار في هذا؟

هل كانت مفيدة؟

المحلول

يبدو أن هذا غير فعال للغاية

لا أعتقد ذلك ... الاختيار الخارجي هو مجرد إسقاط (في الواقع إسقاط هوية) من المختار الداخلي، والاسترافح له تأثير أداء ضئيل ...

فيما يتعلق بفقرة أعلى 2000، فإن حقيقة أنه في المختار الخارجي لا يعني أن DB سيقرأ جميع الصفوف من الاختيار الداخلي؛ سيقرأهم طالما طلبوا من قبل الاختيار الخارجي، ثم توقف.

فقط حاول تشغيل الاستعلام يدويا، مع أو بدون تحديد الخارجي: أراهن أنك لن تجد أي فرق كبير في الأداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top