Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini membahas berbagai metode untuk memuat data secara massal ke instans server fleksibel Azure Database for PostgreSQL, bersama dengan praktik terbaik untuk pemuatan data awal dalam database kosong dan beban data bertahap.
Memuat metode
Metode pemuatan data berikut diatur secara berurutan dari sebagian besar memakan waktu hingga paling sedikit memakan waktu:
- Jalankan perintah rekaman
INSERTtunggal. - Batch menjadi 100 hingga 1.000 baris per penerapan. Anda dapat menggunakan blok transaksi untuk membungkus beberapa rekaman per penerapan.
- Jalankan
INSERTdengan beberapa nilai baris. - Jalankan perintah
COPY.
Metode yang disukai untuk memuat data ke dalam database adalah COPY perintah .
COPY Jika perintah tidak mustahil, batch INSERT adalah metode terbaik berikutnya. Multi-utas dengan COPY perintah optimal untuk memuat data secara massal.
Langkah-langkah untuk mengunggah data massal
Berikut adalah langkah-langkah untuk mengunggah data secara massal ke instans server fleksibel Azure Database for PostgreSQL.
Langkah 1: Siapkan data Anda
Pastikan data Anda bersih dan diformat dengan benar untuk database.
Langkah 2: Pilih metode pemuatan
Pilih metode pemuatan yang sesuai berdasarkan ukuran dan kompleksitas data Anda.
Langkah 3: Jalankan metode pemuatan
Jalankan metode pemuatan yang dipilih untuk mengunggah data Anda ke database.
Langkah 4: Memverifikasi data
Setelah mengunggah, verifikasi bahwa data telah dimuat dengan benar ke dalam database.
Praktik terbaik untuk pemuatan data awal
Berikut adalah praktik terbaik untuk pemuatan data awal.
Jatuhkan indeks
Sebelum Anda melakukan pemuatan data awal, sebaiknya hilangkan semua indeks dalam tabel. Membuat indeks setelah data dimuat selalu lebih efisien.
Menghilangkan batasan
Batasan penurunan utama dijelaskan di sini:
- Batasan kunci unik
Untuk mencapai performa yang kuat, sebaiknya hilangkan batasan kunci unik sebelum pemuatan data awal dan membuatnya kembali setelah beban data selesai. Namun, menghilangkan batasan kunci unik membatalkan perlindungan terhadap data duplikat.
- Batasan kunci asing
Sebaiknya hilangkan batasan kunci asing sebelum pemuatan data awal dan membuatnya kembali setelah pemuatan data selesai.
Mengubah session_replication_role parameter untuk replica juga menonaktifkan semua pemeriksaan kunci asing. Namun, jika perubahan tidak digunakan dengan benar, perubahan tersebut dapat membuat data tidak konsisten.
Tabel yang tidak di-unlogged
Pertimbangkan pro dan kontra tabel yang tidak di-log sebelum menggunakannya dalam pemuatan data awal.
Menggunakan tabel yang tidak di-unlogged mempercepat pemuatan data. Data yang ditulis ke tabel yang tidak di-unlogg tidak ditulis ke log write-ahead.
Kerugian menggunakan tabel yang tidak dialokasikan adalah:
- Mereka bukan crash-safe. Tabel yang tidak di-hapus secara otomatis terpotong setelah crash atau matikan yang tidak jelas.
- Data dari tabel yang tidak di-unlogg tidak dapat direplikasi ke server siaga.
Untuk membuat tabel yang tidak di-log atau mengubah tabel yang sudah ada menjadi tabel yang tidak di-log, gunakan opsi berikut:
Buat tabel baru yang tidak di-unlogg dengan menggunakan sintaks berikut:
CREATE UNLOGGED TABLE <tablename>;Konversikan tabel yang dicatat yang sudah ada ke tabel yang tidak di-log dengan menggunakan sintaks berikut:
ALTER TABLE <tablename> SET UNLOGGED;
Penyetelan parameter server
-
auto vacuum': It's best to turn offvakum otomatis' selama pemuatan data awal. Setelah beban awal selesai, kami sarankan Anda menjalankan manualVACUUM ANALYZEpada semua tabel dalam database lalu mengaktifkanauto vacuum.
Catatan
Ikuti rekomendasi di sini hanya jika ada cukup memori dan ruang disk.
maintenance_work_mem: Dapat diatur ke maksimum 2 gigabyte (GB) pada instans server fleksibel Azure Database for PostgreSQL.maintenance_work_memmembantu mempercepat vakum otomatis, indeks, dan pembuatan kunci asing.checkpoint_timeout: Pada instans server fleksibel Azure Database for PostgreSQL,checkpoint_timeoutnilai dapat ditingkatkan hingga maksimum 24 jam dari pengaturan default 5 menit. Sebaiknya tingkatkan nilai menjadi 1 jam sebelum Anda awalnya memuat data pada instans server fleksibel Azure Database for PostgreSQL.checkpoint_completion_target: Kami merekomendasikan nilai 0,9.max_wal_size: Dapat diatur ke nilai maksimum yang diizinkan pada instans server fleksibel Azure Database for PostgreSQL, yaitu 64 GB saat Anda melakukan pemuatan data awal.wal_compression: Ini dapat diaktifkan. Mengaktifkan parameter ini dapat dikenakan beberapa biaya CPU tambahan untuk pemadatan selama pengelogan dan dekompresi log write-ahead (WAL) selama pemutaran ulang WAL.
Rekomendasi
Sebelum Anda memulai pemuatan data awal pada instans server fleksibel Azure Database for PostgreSQL, kami sarankan Anda:
- Nonaktifkan ketersediaan tinggi di server. Anda dapat mengaktifkannya setelah beban awal selesai pada primer.
- Buat replika baca setelah pemuatan data awal selesai.
- Buat pengelogan minimal atau nonaktifkan semuanya bersama-sama selama pemuatan data awal (misalnya, nonaktifkan pgaudit, pg_stat_statements, penyimpanan kueri).
Membuat ulang indeks dan menambahkan batasan
Dengan asumsi Bahwa Anda menghilangkan indeks dan batasan sebelum beban awal, sebaiknya gunakan nilai tinggi di maintenance_work_mem (seperti yang disebutkan sebelumnya) untuk membuat indeks dan menambahkan batasan. Selain itu, dimulai dengan PostgreSQL versi 11, parameter berikut dapat dimodifikasi untuk pembuatan indeks paralel yang lebih cepat setelah pemuatan data awal:
max_parallel_workers: Mengatur jumlah maksimum pekerja yang dapat didukung sistem untuk kueri paralel.max_parallel_maintenance_workers: Mengontrol jumlah maksimum proses pekerja, yang dapat digunakan dalamCREATE INDEX.
Anda juga dapat membuat indeks dengan membuat pengaturan yang direkomendasikan di tingkat sesi. Berikut adalah contoh cara melakukannya:
SET maintenance_work_mem = '2GB';
SET max_parallel_workers = 16;
SET max_parallel_maintenance_workers = 8;
CREATE INDEX test_index ON test_table (test_column);
Praktik terbaik untuk pemuatan data inkremental
Praktik terbaik untuk pemuatan data inkremental dijelaskan di sini:.
Tabel partisi
Kami selalu menyarankan agar Anda mempartisi tabel besar. Beberapa keuntungan pemartisian, terutama selama beban inkremental, meliputi:
- Membuat partisi baru berdasarkan delta baru membuat penambahan data baru ke tabel menjadi efisien.
- Mempertahankan tabel menjadi lebih mudah. Anda dapat menjatuhkan partisi selama beban data inkremental untuk menghindari penghapusan yang memakan waktu dalam tabel besar.
- Autovacuum hanya akan dipicu pada partisi yang diubah atau ditambahkan selama beban inkremental, yang membuat mempertahankan statistik pada tabel lebih mudah.
Pertahankan statistik tabel terbaru
Memantau dan memelihara statistik tabel penting untuk performa kueri pada database. Ini juga termasuk skenario di mana Anda memiliki beban bertahap. PostgreSQL menggunakan proses daemon autovacuum untuk membersihkan tuple mati dan menganalisis tabel untuk menjaga statistik tetap diperbarui. Untuk informasi selengkapnya, lihat Pemantauan dan penyetelan autovacuum.
Membuat indeks pada batasan kunci asing
Membuat indeks pada kunci asing dalam tabel anak dapat bermanfaat dalam skenario berikut:
- Pembaruan atau penghapusan data dalam tabel induk. Saat data diperbarui atau dihapus dalam tabel induk, pencarian dilakukan pada tabel anak. Anda dapat mengindeks kunci asing pada tabel anak untuk membuat pencarian lebih cepat.
- Kueri, tempat Anda dapat melihat tabel induk dan anak yang bergabung pada kolom kunci.
Mengidentifikasi indeks yang tidak digunakan
Identifikasi indeks yang tidak digunakan dalam database dan letakkan. Indeks adalah overhead pada pemuatan data. Semakin sedikit indeks pada tabel, semakin baik performa selama penyerapan data.
Anda dapat mengidentifikasi indeks yang tidak digunakan dengan dua cara: menurut Penyimpanan Kueri dan kueri penggunaan indeks.
Penyimpanan Kueri
Fitur Penyimpanan Kueri membantu mengidentifikasi indeks, yang dapat dihilangkan berdasarkan pola penggunaan kueri pada database. Untuk panduan langkah demi langkah, lihat Penyimpanan Kueri.
Setelah mengaktifkan Penyimpanan Kueri di server, Anda bisa menggunakan kueri berikut untuk mengidentifikasi indeks yang bisa dihilangkan dengan menyambungkan ke database azure_sys.
SELECT * FROM IntelligentPerformance.DropIndexRecommendations;
Penggunaan indeks
Anda juga bisa menggunakan kueri berikut untuk mengidentifikasi indeks yang tidak digunakan:
SELECT
t.schemaname,
t.tablename,
c.reltuples::bigint AS num_rows,
pg_size_pretty(pg_relation_size(c.oid)) AS table_size,
psai.indexrelname AS index_name,
pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
CASE WHEN i.indisunique THEN 'Y' ELSE 'N' END AS "unique",
psai.idx_scan AS number_of_scans,
psai.idx_tup_read AS tuples_read,
psai.idx_tup_fetch AS tuples_fetched
FROM
pg_tables t
LEFT JOIN pg_class c ON t.tablename = c.relname
LEFT JOIN pg_index i ON c.oid = i.indrelid
LEFT JOIN pg_stat_all_indexes psai ON i.indexrelid = psai.indexrelid
WHERE
t.schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2;
Kolom number_of_scans, tuples_read, dan tuples_fetched akan menunjukkan indeks usage.number_of_scans nilai kolom nol poin sebagai indeks yang tidak digunakan.
Penyetelan parameter server
Catatan
Ikuti rekomendasi dalam parameter berikut hanya jika ada cukup ruang memori dan disk.
maintenance_work_mem: Parameter ini dapat diatur ke maksimum 2 GB pada instans server fleksibel Azure Database for PostgreSQL.maintenance_work_memmembantu mempercepat pembuatan indeks dan penambahan kunci asing.checkpoint_timeout: Pada instans server fleksibel Azure Database for PostgreSQL,checkpoint_timeoutnilai dapat ditingkatkan menjadi 10 atau 15 menit dari pengaturan default 5 menit. Meningkatkancheckpoint_timeoutke nilai yang lebih signifikan, seperti 15 menit, dapat mengurangi beban I/O, tetapi kelemahannya adalah dibutuhkan waktu lebih lama untuk pulih jika ada crash. Kami merekomendasikan pertimbangan yang cermat sebelum Anda membuat perubahan.checkpoint_completion_target: Kami merekomendasikan nilai 0,9.max_wal_size: Nilai ini tergantung pada SKU, penyimpanan, dan beban kerja. Contoh berikut menunjukkan salah satu cara untuk sampai pada nilai yang benar untukmax_wal_size.
Selama jam kerja sibuk, tiba di nilai dengan melakukan hal berikut:
sebuah. Ambil nomor urutan log WAL (LSN) saat ini dengan menjalankan kueri berikut:
SELECT pg_current_wal_lsn ();
b. Tunggu checkpoint_timeout jumlah detik. Ambil WAL LSN saat ini dengan menjalankan kueri berikut:
SELECT pg_current_wal_lsn ();
c. Gunakan dua hasil untuk memeriksa perbedaan dalam GB:
SELECT round (pg_wal_lsn_diff('LSN value when running the second time','LSN value when run the first time')/1024/1024/1024,2) WAL_CHANGE_GB;
-
wal_compression: Ini dapat diaktifkan. Mengaktifkan parameter ini dapat dikenakan biaya CPU tambahan untuk pemadatan selama pengelogan WAL dan dekompresi selama pemutaran ulang WAL.
Konten terkait
- Memecahkan masalah pemanfaatan CPU tinggi di Azure Database for PostgreSQL.
- Memecahkan masalah pemanfaatan memori tinggi di Azure Database for PostgreSQL.
- Memecahkan masalah dan mengidentifikasi kueri yang berjalan lambat di Azure Database for PostgreSQL.
- Parameter server di Azure Database for PostgreSQL.
- Penyetelan autovacuum di Azure Database for PostgreSQL.