كيف يمكنني تعيين DataAdapter.UpdateBatchSize إلى "الأمثل" قيمة ؟

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

سؤال

لقد حصلت أخيرا بلدي إدراج دفعة للعمل والآن كنت أترنم مع حجم الدفعة, ولكن لا أستطيع أن أرى أي فرق في الأداء بين قيمة 50 وقيمة 10000.وهذا يبدو غريبا جدا بالنسبة لي, ولكن أنا لا أعرف ما يحدث خلف الكواليس ، لذلك قد يكون من السلوك العادي.

انا إدراج 160k الصفوف في الجدول يعني وقت اختبار القيم 115 +/- 2 secs.دون الخلط يستغرق 210 ثانية, لذلك أنا راض تماما مع تحسن.الجدول الهدف هو:

CREATE TABLE [dbo].[p_DataIdeas](
    [wave] [int] NOT NULL,
    [idnumber] [int] NOT NULL,
    [ideaID] [int] NOT NULL,
    [haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen]  DEFAULT ((0)),
  CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED 
(
  [wave] ASC,
  [idnumber] ASC,
  [ideaID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON
) ON [PRIMARY]
) ON [PRIMARY]

قرأت ما الذي تبحث عنه عند إعداد UpdateBatchSize وكان الجواب ببساطة اختبار اثنين من قيم مختلفة.أستطيع أن أفهم ذلك, لكن لا ينبغي أن يكون من الممكن حساب أو على الأقل تقدير قيمة جيدة إذا كنت تعرف تصميم جدول SQL السؤال البيانات التي سيتم إدراج ؟

هل هناك أي أفضل الممارسات هناك شخص يمكن أن يوصي ؟

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

المحلول

يمكنك أن ترى تأثير الخلط إما من خلال النظر في منشئ ملفات التعريف SQL أو عن طريق الاتصال SqlConnection.RetrieveStatistics().ما يجب أن نرى أن كل دفعة يتوافق مع واحدة ذهابا وإيابا إلى DB.

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

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

الخطوة الأولى في تحسين الأداء الخاص بك إدراج سيتم القيام بها في المعاملات ربما صفقة واحدة كل دفعة أو اثنين.أبعد من ذلك, طاولة الكرام المعلمات ربما الخطوة التالية باستخدام إجراء مخزن مع INSERT INTO Table SELECT column FROM @TableArgument.

نصائح أخرى

على الرغم من أن تغيير UpdateBatchSize سوف تساعد إلى حد ما النهج الأساسي من استخدام DataAdapter تحديث الكثير من السجلات ستكون بطيئة.هذا هو لأنه في نهاية المطاف ، منفصلة SQL (إدراج أو تحديث أو حذف) سيتم إنشاؤها بواسطة DataAdapter لكل صف.UpdateBatchSize يؤثر فقط على كيفية العديد من تلك البيانات الفردية يتم إرسال في واحد tsql ضمن الدفعة عند إرسالها إلى SQL Server.

للحصول على أكبر التحسينات في الأداء ، تريد SQLServer إلى إدراج/تحديث/حذف العديد من السجلات في بيان واحد (عادة باستخدام صلة من نوع ما).الجدول قيم المعلمات (كما ذكر RickNZ) هو إحدى الطرق للقيام بذلك.احتمال آخر هو استخدام SqlBulkCopy (على الرغم من أنك سوف تحتاج عادة إلى استخدام التدريج الجدول لهذا).

تأكد من أن هناك أيضا المعاملات النشطة فإنه سيتم تحسين الأداء بشكل كبير (حوالي 30x في بلدي التجارب باستخدام MysqlDataAdapter).

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