it-swarm.asia

ما هو الأفضل للتغييرات الكبيرة على الجدول: حذف وإدراج في كل مرة أو تحديث موجود؟

أقوم بإنشاء مشروع حيث أحتاج إلى تغيير حوالي 36 ألف سجل في جدول واحد يوميًا. أتساءل ما الذي سيكون أداؤه أفضل:

  1. حذف الصفوف وإدراج صفوف جديدة ، أو
  2. تحديث الصفوف الموجودة بالفعل

بالنسبة لي ، من الأسهل فقط حذف جميع الصفوف وإدراج صفوف جديدة ، ولكن إذا كان ذلك سيؤدي إلى تفتيت الجدول والفهارس وتأثير الأداء ، فإنني أفضل إجراء التحديثات حيثما أمكن وحذفها/إدراجها عند الضرورة فقط.

ستكون هذه خدمة ليلية ، ولا أتطلع إلى تحسين سرعة العملية نفسها. أنا أكثر قلقا بشأن أداء الاستعلامات مقابل هذا الجدول بشكل عام حيث لدي بالفعل 89 مليون سجل وكيف ستؤثر عليه هذه العملية الليلية.

هل ينبغي علي حذف/إدراج السجلات أم يجب تحديث السجلات الموجودة (حيثما أمكن) لهذه العملية الليلية؟

27
adopilot

يعتمد الأمر حقًا على مقدار البيانات التي تتغير. لنفترض أن هذا الجدول يحتوي على 20 عمودًا. ولديك أيضًا 5 فهارس لكل منها فرق. عمود.

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


في البحث الإضافي ، وجدت أن التعليق أعلاه من قبلي نوع من التكرار لأنه يحتوي SQL Server داخليًا على آليتين منفصلتين لإجراء تحديث. - "تحديث موضعي" (أي عن طريق تغيير قيمة الأعمدة إلى جديد في الصف الأصلي) أو "تحديث غير موضعي" (DELETE متبوعًا بإدخال).

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

على سبيل المثال: إذا كان لديك فهرس مجمع على اسم العائلة ولديك الأسماء: Able و Baker و Charlie الآن فأنت تريد تحديث Baker إلى Becker. لا يجب نقل أي صفوف. لذلك يمكن أن يحدث ذلك في مكانه. في حين ، إذا كان عليك تحديث Able إلى Kumar ، فيجب تغيير الصفوف (على الرغم من أنها ستكون في نفس الصفحة). في هذه الحالة ، سيقوم SQL Server بحذف متبوعًا بإدخال.

بالنظر إلى ما سبق ، أود أن أقترح عليك إجراء تحديث عادي والسماح لـ SQL Server بتحديد أفضل طريقة لكيفية القيام بذلك داخليًا.

لمزيد من التفاصيل حول الأجزاء الداخلية "UPDATE" أو فيما يتعلق بأي من الأجزاء الداخلية ذات الصلة بـ SQL Server ، راجع كتاب Kalen Delaney و Paul Randal's وآخرون - SQL Server 2008 Internals .

10
Dharmendar Kumar 'DK'

هل تحققت من الأمر دمج في SQL 2008؟ فيما يلي مثال أساسي:

  merge YourBigTable ybt
  using (select distinct (RecordID) from YourOtherTable) yot
     on yot.Recordid = YBT.RecordID
  when NOT matched by target
  then  insert (RecordID)
        values (yot.DeviceID) ;

هذا في الأساس أمر "UPSERT". قم بالتحديث إذا كان موجودًا ، فأدخله إذا لم يكن موجودًا. أمر سريع جدا ، رائع جدا.

8
datagod

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

لذا ، أطلب منكم ألا تخمنوا. ستتغير المعادلات عند التعامل مع جدول كبير مع العديد من الأعمدة ومع الكثير من البيانات.

4
srinivas

التحديث ليس بالسرعة. الحيلة لتحقيق إدراج سريع هو تعطيل الفهارس أثناء إدخال البيانات.

ضع في اعتبارك استخدام هذا:

-- disable indexes
ALTER INDEX [index_name] ON dbo.import_table DISABLE
-- ... disable more indexes

-- don't use delete if you don't care about minimal logging. truncate is faster
TRUNCATE TABLE dbo.import_table

-- just insert the new rows
INSERT dbo.import_table
SELECT
    *
FROM
    dbo.source_table

-- rebuild indexes
ALTER INDEX [index_name] ON dbo.import_table REBUILD
-- ... rebuild more indexes

والأكثر سرعة هو إيقاف تحديث الإحصائيات التلقائي في خيارات ديسيبل. إذا تم تغيير الجدول بشكل ملحوظ ، يجب تشغيل:

UPDATE STATISTICS dbo.import_table

أو

EXEC sp_updatestats

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

3
Asken