Terjemahan gratis dari artikel "7 Tips Praktik Terbaik untuk Memuat Data Massal PostgreSQL"
Terkadang perlu memuat data dalam jumlah besar ke database PostgreSQL dalam beberapa langkah sederhana. Praktik ini biasanya disebut sebagai impor massal, dengan satu atau beberapa file besar berfungsi sebagai sumber data. Proses ini terkadang bisa sangat lambat. Ada beberapa alasan untuk kinerja yang buruk ini. Indeks, pemicu, kunci asing dan primer, atau bahkan penulisan file WAL dapat menyebabkan penundaan.
Pada artikel ini, kami akan memberikan beberapa tip praktis untuk mengimpor data secara massal ke database PostgreSQL. Namun, mungkin ada situasi di mana tidak satupun dari mereka merupakan solusi efektif untuk masalah tersebut. Kami mendorong pembaca untuk mempertimbangkan manfaat dan kerugian dari metode apa pun sebelum menerapkannya.
Tip 1. Menempatkan tabel target dalam mode non-logging
Di PostgreSQL9.5 dan yang lebih baru, tabel target dapat diatur ke mode non-log, dan kembali ke mode log setelah memuat data.
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 .
Impor data secara massal untuk aplikasi database tidak terjadi setiap hari, tetapi hal itu memengaruhi kinerja kueri. Itulah mengapa sangat penting untuk mengurangi waktu pemuatan sebanyak mungkin. Satu hal yang dapat dilakukan DBA untuk meminimalkan kemungkinan kejutan apa pun adalah melakukan pengoptimalan beban di lingkungan pengujian dengan server serupa dan PostgreSQL yang dikonfigurasi dengan cara serupa. Ada beberapa skenario berbeda untuk memuat data, dan yang terbaik adalah mencoba setiap metode dan memilih satu yang berfungsi dengan baik.