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

Loading