From: | Samed YILDIRIM <samed(at)reddoc(dot)net> |
---|---|
To: | Fırat Güleç <firat(dot)gulec(at)hepsiexpress(dot)com>, "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org> |
Subject: | Re: Bulk Update |
Date: | 2017-09-30 13:00:20 |
Message-ID: | 532891506776420@web12j.yandex.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
Selamlar Fırat,
Bu gereksinim için dblink'i kullanabilirsin. dblink ile çalıştırdığın sorgu mevcut transaction'dan bağımsız olarak hedef veritabanında çalışacaktır. Aşağıdaki dblink_exec bölümünü döngünün içerisine koyarak döngü içerisinde transaction açıp update yapabilir, istediğin sıklıkta transaction'ı commit edebilirsin.
Eklentiyi yaratmak için:
create extension dblink;
Eklentiyi oluşturduktan sonra transaction içerisinde aşağıdaki gibi kullanabilirsin.
begin;
--dblink ile veritabanına bağlan
select dblink_connect('dbname=firat');
--transaction'ı başlat
select dblink_exec('begin;');
-- sorguyu çalıştır
select dblink_exec('update bulk_update set c1=10 where id =50000;');
--transaction'ı commit et
select dblink_exec('commit;');
-- dblink bağlantısını sonlandır
select dblink_disconnect();
commit;
İyi çalışmalar.
Samed YILDIRIM
29.09.2017, 10:03, "Fırat Güleç" firat(dot)gulec(at)hepsiexpress(dot)com:
Merhabalar,
Bir konuda yardımınız ihtiyacım var. Postgresql 9.5.8 versiyonunu kullanıyoruz. Bulk bir update yapmaya ihtiyacımız oldu, yaklaşık 4.5 milyonluk bir kayıt. Oracle’da begin end’in arasına commit koyabiliyorduk. Fakat Postgresql’de bunu yapamadığımızı farkına vardık. 100 kayıt update ettikten sonra commit yapmak istiyoruz. Bu gibi ihtiyaçlar için Postgresql’de nasıl bir çözüm kullanıyorsunuz?
İyi çalışmalar.
Örnek kod:
DECLARE
c_delivery RECORD;
cur_rad CURSOR (x_address_id BIGINT, x_receiver_id BIGINT) FOR SELECT *
FROM receiver_address
WHERE receiver_id = x_receiver_id AND
address_id = x_address_id;
c_rad RECORD;
BEGIN
FOR c_delivery IN SELECT * FROM delivery WHERE recipient_address_id is NULL LIMIT p_record_cnt LOOP
OPEN cur_rad(c_delivery.receiver_address_id,c_delivery.receiver_id);
FETCH cur_rad INTO c_rad;
IF c_rad.id IS NOT NULL
THEN
UPDATE ******* SET recipient_address_id = c_rad.id WHERE id = c_delivery.id;
UPDATE ************ SET recipient_address_id = c_rad.id WHERE delivery_id = c_delivery.id;
END IF;
CLOSE cur_rad;
END LOOP;
END;
FIRAT GÜLEÇ
Veritabanı Yöneticisi
firat(dot)gulec(at)hepsiexpress(dot)com
M:0 532 210 57 18
İnönü Mh. Mimar Sinan Cd. No:3 Güzeller Org.San.Bölg. GEBZE / KOCAELİ
From | Date | Subject | |
---|---|---|---|
Next Message | Erkan Durmuş | 2017-09-30 14:25:23 | Re: Bulk Update |
Previous Message | Fırat Güleç | 2017-09-30 12:31:57 | Re: Bulk Update |