ترجمة مجانية للمقال "7 نصائح لأفضل الممارسات لتحميل البيانات المجمعة لـ PostgreSQL"
في بعض الأحيان يصبح من الضروري تحميل كمية كبيرة من البيانات في قاعدة بيانات PostgreSQL في بضع خطوات بسيطة. يشار إلى هذه الممارسة عمومًا باسم الاستيراد المجمع ، حيث يعمل ملف كبير واحد أو أكثر كمصدر للبيانات. يمكن أن تكون هذه العملية بطيئة في بعض الأحيان بشكل غير مقبول. هناك عدة أسباب لهذا الأداء الضعيف. يمكن أن تتسبب الفهارس والمشغلات والمفاتيح الخارجية والأساسية أو حتى كتابة ملفات WAL في حدوث تأخيرات.
في هذه المقالة ، سنقدم بعض النصائح العملية لاستيراد البيانات المجمعة إلى قواعد بيانات PostgreSQL. ومع ذلك ، قد تكون هناك حالات لا يمثل فيها أي منها حلاً فعالاً للمشكلة. نحن نشجع القراء على النظر في مزايا وعيوب أي طريقة قبل تطبيقها.
تلميح 1. وضع الجدول الهدف في الوضع غير المسجل
في PostgreSQL9.5 والإصدارات الأحدث ، يمكن ضبط الجدول الهدف على الوضع غير المسجل ، وإعادته إلى الوضع المسجل بعد تحميل البيانات.
ALTER TABLE <target table> SET UNLOGGED;
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED;
يضمن الوضع غير المسجل أن PostgreSQL لن ترسل عمليات تحميل إلى جدول في سجل الكتابة المسبقة (WAL). يمكن أن يؤدي ذلك إلى تسريع عملية التنزيل بشكل كبير. ومع ذلك ، نظرًا لعدم تسجيل هذه العمليات ، لا يمكن استرداد البيانات في حالة حدوث فشل أو تعطل غير مخطط لخدمة PostgreSQL أثناء التحميل. ستعمل PostgreSQL تلقائيًا على تحديد أي جدول غير مسجل بعد إعادة التشغيل.
بالإضافة إلى ذلك ، لا يتم نسخ الجداول غير المسجلة إلى الخوادم التابعة. في مثل هذه الحالات ، يُنصح بإيقاف عرض التغييرات على النسخة المتماثلة قبل تحميلها واستعادتها بعد ذلك. اعتمادًا على كمية البيانات الموجودة على الجهاز الرئيسي وعدد النسخ المتماثلة ، يمكن أن يستغرق استرداد النسخ المتماثل وقتًا طويلاً ، والذي قد لا يفي بمتطلبات أنظمة الإتاحة العالية.
:
- c ;
- ;
- , , .
2.
. , , .
, -, , . , , , , .
DROP INDEX <index_name1>, <index_name2> … <index_name_n>
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n)
maintenance_work_mem. .
, . : . , , .
3.
, , – , . PostgreSQL .
, , . , , , .
ALTER TABLE <target_table>
DROP CONSTRAINT <foreign_key_constraint>;
BEGIN TRANSACTION;
<bulk data insert operations…>
COMMIT;
ALTER TABLE <target_table>
ADD CONSTRAINT <foreign key constraint>
FOREIGN KEY (<foreign_key_field>)
REFERENCES <parent_table>(<primary key field>)...;
, maintenance_work_mem .
4.
INSERT DELETE ( ) . , , , .
, . , .
ALTER TABLE <target table> DISABLE TRIGGER ALL;
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL;
5. COPY
PostgreSQL – COPY . COPY . , INSERT INSERT- VALUE
COPY <target table> [( column1>, … , <column_n>)]
FROM '<file_name_and_path>'
WITH (<option1>, <option2>, … , <option_n>)
COPY:
- , , ;
- ;
- ;
- WHERE.
6. INSERT VALUE
INSERT – . , INSERT , , WAL.
INSERT VALUE .
INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>)
VALUES
(<value a>, <value b>, …, <value x>),
(<value 1>, <value 2>, …, <value n>),
(<value A>, <value B>, …, <value Z>),
(<value i>, <value ii>, …, <value L>),
...;
INSERT VALUES . .
, , , PostgreSQL INSERT VALUES. INSERT, RAM , .
effective_cache_size 50%, shared_buffer 25% . , , INSERT VALUES, 1000 .
7. ANALYZE
, ANALYZE . , , . , . ANALYZE .
لا يحدث الاستيراد الجماعي للبيانات لتطبيقات قواعد البيانات كل يوم ، ولكنه يؤثر على أداء الاستعلام. هذا هو السبب في أنه من الضروري تقليل أوقات التحميل قدر الإمكان. أحد الأشياء التي يمكن أن يقوم بها مسؤولو قواعد البيانات لتقليل احتمالية حدوث أي مفاجآت هو إجراء تحسين التحميل في بيئة اختبار باستخدام خادم مشابه و PostgreSQL تم تكوينه بطريقة مماثلة. هناك سيناريوهات مختلفة لتحميل البيانات وسيكون من الأفضل تجربة كل طريقة واختيار طريقة تعمل بشكل جيد.