sql-server - قواعد - حذف قاعدة بيانات sql




أسرع طريقة لحذف جميع البيانات في جدول كبير (10)

إذا لم تتمكن من استخدام ترونكات تابل بسبب مفاتيح و / أو مشغلات خارجية، فيمكنك مراعاة:

  • إسقاط جميع المؤشرات؛
  • تفعل ديليت المعتادة.
  • إعادة إنشاء كافة الفهارس.

هذا قد تسرع ديليت إلى حد ما.

كان علي حذف جميع الصفوف من جدول سجل يحتوي على حوالي 5 ملايين صف. كانت المحاولة الأولى لإصدار الأمر التالي في محلل الاستعلام:

حذف من client_log

الذي استغرق وقتا طويلا جدا.


اقتراح "إسقاط وإعادة إنشاء الجدول" ربما ليست جيدة لأن ذلك يطحن المفاتيح الخارجية الخاصة بك.

كنت تستخدم مفاتيح أجنبية، أليس كذلك؟


على سكل سيرفر يمكنك استخدام الأمر Truncate Table الذي هو أسرع من حذف العادية ويستخدم أيضا موارد أقل. فإنه سيتم إعادة تعيين أي حقول الهوية مرة أخرى إلى قيمة البذور أيضا.

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


لاحظ أن ترونكات سيتم أيضا إعادة تعيين أي مفاتيح زيادة السيارات، إذا كنت تستخدم تلك.

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


نعم، حسنا، حذف 5 ملايين صف من المرجح أن يستغرق وقتا طويلا. إن الطريقة الوحيدة التي يمكن أن أفكر بها في أسرع وقت ممكن هي إسقاط الجدول، وإعادة إنشائه. هذا يعمل فقط، بطبيعة الحال، إذا كنت ترغب في حذف كافة البيانات في الجدول.


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


يمكنني استخدام الطريقة التالية إلى الصفر خارج الجداول، مع مكافأة إضافية أنه يترك لي مع نسخة الأرشيف من الجدول.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;

truncate table ليس سكل منصة مستقلة. إذا كنت تشك في أنك قد تتغير من أي وقت مضى موفري قاعدة البيانات، قد تكون حذرا من استخدامه.


إنني أعيد النظر في بياني السابق:

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

كان القصد من البيان أعلاه أن يدفعك للتأكد من أنك تفهم أن هناك فرق بين الاثنين. لسوء الحظ، هو مكتوب بشكل سيء ويجعل البيانات غير معتمد كما لم أكن قد فعلت أي اختبار نفسي بين الاثنين. وهو يستند إلى البيانات التي سمعت من الآخرين.

من مسن :

يزيل عبارة ديليت الصفوف واحد في كل مرة ويسجل إدخالا في سجل المعاملات لكل صف محذوف. يقوم ترونكات تابل بإزالة البيانات عن طريق إلغاء تخصيص صفحات البيانات المستخدمة لتخزين بيانات الجدول ويتم تسجيل عمليات إزالة الصفحة فقط في سجل المعاملات.

أردت فقط أن أقول أن هناك فرقا جوهريا بين الاثنين ولأن هناك فرقا، وسوف تكون هناك تطبيقات حيث قد تكون واحدة أو أخرى غير لائقة.


DELETE * FROM table_name;

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

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

للسرعة أعتقد أنه يعتمد على ...

  • قاعدة البيانات الأساسية: أوراكل، ميكروسوفت، ميسكل، بوستغريزل، أوثرز، كوستوم ...

  • الجدول، انها المحتوى، والجداول ذات الصلة:

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

DROP TABLE table_name;

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







tsql