Linq إلى SQL: حدد التحسين

على جداول كبيرة في MSSQL. يؤدي تحديد أعمدة محددة إلى الحصول على سرعة أكبر في طلب البحث. هل ينطبق الشيء نفسه على Linq إلى SQL؟

هل هذا:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

يكون أسرع من هذا:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select p;

...؟

6

6 إجابة

أنا أوصي بشدة LinqPad . وهو مجاني ويتيح لك تشغيل استعلامات LINQ ديناميكيًا. عندما يمكنك أيضا النظر في SQL التي يتم إنشاؤها.

ما سترونه هو أن استعلام LINQ سيقوم بترجمة الاستعلام الأول إلى تحديد تلك الأعمدة فقط. لذلك هو أسرع.

6
وأضاف

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

EDIT ading clarification from comment

كيف يتم هذا بشكل أفضل ، فإنه سيتم تقليل حجم البيانات الناتجة التي تم إرجاعها من SQL و سيتم تقليل حجم الكائنات المستخدمة لتخزين النتائج في الذاكرة.

هذا يرجع إلى حقيقة أنه في النهاية LINQ إلى SQL يولد SQL ، لذلك توجد فوائد الأداء نفسه.

4
وأضاف
على حد سواء! سيستجيب SQL Server بشكل أسرع ، مما يحد من البيانات المرسلة ، وسيقلل حجم المجموعة التي تحتوي على النتائج ، مما يقلل من الذاكرة
وأضاف المؤلف Mitchel Sellers, مصدر
مما أدى إلى انخفاض تخصيص الذاكرة؟ أو سرعة أكبر؟
وأضاف المؤلف roosteronacid, مصدر

هناك 3 جوانب مع "أسرع" هنا.

  1. أقل وسائل نقل البيانات بسرعة. من ناحية أخرى سوف لا تحصل على بشكل ملحوظ بشكل أسرع ، ما لم تحدد أكثر من صف واحد أو إذا كان شخصك يحتوي على بعض الأعمدة "الثقيلة" الأخرى - طويلة varchars، image etc.
  2. كما أشار J. كوران ، أقل الذاكرة المخصصة تعني أسرع. تنطبق الملاحظة نفسها الواردة في 1. هنا.

  3. تنفيذ الاستعلام الخاص بك بشكل أسرع إذا كنت لديك فهرس يحتوي على جميع الأعمدة المحددة (أو المرفقة بها بدءًا من SQL Server 2005). في هذه الحالة لا يحتاج مشغل SQL Server إلى تحميل الصفحة ذات الصف في الذاكرة - إذا لم يكن موجودًا بعد.

أنا شخصياً لن أزعج نفسي محاولة تحسين استعلاماتي بهذه الطريقة (إلا إذا قلت أن صفوفك تحتوي على بيانات ثنائية أو سلاسل طويلة جدًا لا تحتاجها) ، جزئيًا لأنه إذا قررت لاحقًا أنك ترغب في الحصول على المزيد معلومات حول هذا الشخص المختار ، سوف تحتاج إلى تغيير رمز الوصول DB الخاص بك مقابل مجرد الوصول إلى خاصية في POCO/الصف المجهول الخاص بك.

3
وأضاف

بالإضافة إلى ما قاله الآخرون ، سيكون الهيكل الجديد غير المسمى كائنًا أخف وزنًا بكثير من جسم الشخص - سيكون أسرع بكثير ، حتى إذا قمت بتحديد جميع الأعمدة. (الشخص لديه طريقة/حقول إلخ لدعم كتابة الكائن مرة أخرى إلى قاعدة البيانات. هذا النوع غير المسموح به لا.)

1
وأضاف

أعتقد أن نفس الشيء ينطبق ، لأن LINQ إلى SQL يترجم عمليات استعلام Linq إلى أوامر SQL.

1
وأضاف

إذا كان لديك أعمدة كبيرة جدًا مثل الثنائيات والصور ، فبإمكانها إحداث فرق كبير وهذا هو السبب في أن LINQ to SQL يسمح لك بتحديد تأخير التحميل لأعمدة معينة حتى تتمكن من تحديد كائنات كاملة دون إجراء "تحديد جديد" .

1
وأضاف