PostgreSQL Bulk İnsert(pg_bulkload)
PostgreSQL Bulk İnsert(pg_bulkload),PostgreSQL de Bulk insert yaparken en çok kullandığımız komutlardan birisi de copy komutudur . Copy ile ilgili detaylı bilgi ve örnekler için COPY import ,copy export yazılarımı okuyabilirsiniz.
COPY komutu, elimizde çok veri var ve hızlı bir şekilde yüklenmesini istiyorsak bazı durumlarda yetersiz kalabilmektedir.
COPY komutundan daha hızlı ve parallelik gibi seçenekleri olan pg_bulkload ,copy den daha hızlıdır.
Item |
Duration |
Duration comparison |
COPY with indexes |
140 sec |
– |
COPY without indexes + CREATE INDEX |
187 sec (62 sec + 60 sec + 65 sec) |
133.6 % |
pg_bulkload (DIRECT) with indexes |
93 sec |
66.4 % |
pg_bulkload (PARALLEL) with indexes |
70 sec |
50.0 % |
Yukarıda copy komutu ile pg_bulkload arasındaki fark belirtilmiştir. Görüldüğü üzere pg_bulkload ,copy komutundan daha hızlı bir şekilde dosyayı aktardığı görülmektedir.
Kuruluma geçmeden önce bu işlemler postgresql 12 de yapılmaktadır. Postgresql 12 de işlem yapmak ve hata almamak için postgresql12-devel paketini yüklemeniz gerekmektedir.
Pg_bulkload extensionını yüklemek için aşağıdaki adımları izleyebilirsiniz.
İlk olarak github üzerinden dosyayı kendi bilgisayarımıza çekiyoruz.
git clone https://github.com/etcimon/pg_bulkload.git
Bulunduğumuz dizine indirdiğimiz dosyanın içerisinde aşağıdaki şekilde giriyoruz.
cd pg_bulkload
Makineniz üzerinde birden fazla postgresql clusterı varsa aşağıdaki şekilde library i belirterek make yapmanız gerekiyor.
PATH=/usr/pgsql-12/bin:$PATH make
Make ve make install yaptıktan sonra yüklenip yüklenmediğini kontrol etmek için aşağıdaki komutu çalıştıralım.
PATH=/usr/pgsql-12/bin:$PATH make installcheck
Pg_bulkload extensionımız yüklenmiştir.
Extension yüklendikten sonra Pg_bulkload database bağlantısı için aşağıdaki parametreleri kullanabilirsiniz.
-d = veritabanı_adi
-h = postgresql ip
-p = postgresql port
-U = postgreslq username
-W = password
pg_bulkload işlemini yaparak address tablomuza beri yükleyelim.
İlk olarak bulk insert işlemi yapılacağından dolayı tablomuzu unlogged şeklinde oluşturuyoruz. Unlogged ile ilgili detaylı bilgi için UNLOGGED TABLE ile ilgili yazıma göz atabilirsiniz.
CREATE UNLOGGED TABLE public.address
(
address_id integer NOT NULL ,
address text COLLATE pg_catalog."default" ,
address2 text COLLATE pg_catalog."default",
district text COLLATE pg_catalog."default",
city_id integer ,
postal_code text COLLATE pg_catalog."default",
phone text COLLATE pg_catalog."default" ,
last_update timestamp with time zone NOT NULL DEFAULT now());
Yukarıdaki gibi tablomuzu oluşturduktan sonra aşağıdaki şekilde csv dosyamızı tabloya yüklüyoruz.
/usr/pgsql-12/bin/pg_bulkload -i /var/lib/pgsql/13/backups/address.csv -O public.address --port 5434 -d farukerdem -l /var/lib/pgsql/13/backups/bulkload.log -o "TYPE=CSV" -o "DELIMITER=|" -o "MULTI_PROCESS=YES"
Yukaridaki komutu çalıştirarak csv dosyamızı public.address tablomuzu yüklemiş oluyoruz.
Yukarıda kullandığımız komutları açıklayalım.
-i parametresi ile tabloya yüklenmek istenen csv dosyamızı belirtiyoruz.
-O parametresi ile csv dosyamızı yüklemek istediğimiz tabloyu seçiyoruz.
-l parametresi ile bulk işlemi sırasında hata loglarinin nereye yapılacağını belirtiyoruz.
-o parametresi
“TYPE=CSV” ile csv formatında olduğunu belirtiyoruz.
“DELİMİTER=|” ile delimiter i belirtiyoruz.
“MULTI_PROCESS=YES” ile bulk işleminin paralel yapılması için