PostgreSQL TRIGGER (ları) ölçeklendirme


14

Postgres mekanizma ölçeklerini nasıl tetikler?

Büyük bir PostgreSQL kurulumumuz var ve günlük tablolarını ve TRIGGER (leri) kullanarak olay tabanlı bir sistem uygulamaya çalışıyoruz.

Temel olarak, UPDATE / INSERT / DELETE işlemi için bilgilendirilmek istediğimiz her tablo için bir TRIGGER oluşturmak istiyoruz. Bu tetikleyici tetiklendiğinde, daha sonra harici bir hizmetten yoklayacağımız bir günlük tablosuna yeni bir satır (etkinliği kodlayan) ekleyecek bir işlev yürütür.

Postgres TRIGGER (ler) ile çalışmaya başlamadan önce bunların nasıl ölçeklendiğini bilmek istiyoruz: Tek bir Postgres kurulumunda kaç tetikleyici oluşturabiliriz? Sorgu performansını etkiler mi? Bunu daha önce deneyen var mı?


PgQ kontrolünü yararlı bulabilirsiniz , veri değiştirme olaylarını kaydetmek için C tetikleyicileri kullanır.
dezso

Tetikleyicilere ihtiyacınız olmayabileceğine dair dinleme / bildirimde
bulunun

Yanıtlar:


17

Temel olarak, UPDATE / INSERT / DELETE işlemi için bilgilendirilmek istediğimiz her tablo için bir TRIGGER oluşturmak istiyoruz. Bu tetikleyici tetiklendiğinde, daha sonra harici bir hizmetten yoklayacağımız bir günlük tablosuna yeni bir satır (etkinliği kodlayan) ekleyecek bir işlev yürütür.

Bu bir tetikleyici için oldukça standart bir kullanımdır.

Postgres TRIGGER (ler) ile çalışmaya başlamadan önce bunların nasıl ölçeklendiğini bilmek istiyoruz: Tek bir Postgres kurulumunda kaç tetikleyici oluşturabiliriz?

Onları oluşturmaya devam ederseniz, sonunda disk alanınız tükenir.

Tetikleyiciler için belirli bir sınır yoktur.

PostgreSQL sınırları yaklaşık sayfada belgelenmiştir .

Sorgu performansını etkiler mi?

Tetikleyici tipine, tetikleme diline ve tetiğin ne yaptığına bağlıdır.

BEFORE ... FOR EACH STATEMENTHiçbir şey yapmayan basit bir PL / PgSQL tetikleyicisi sıfıra yakın ek yüke sahiptir.

FOR EACH ROWtetikleyiciler, tetikleyicilerden daha yüksek ek yüke sahiptir FOR EACH STATEMENT. Etkilenen satır sayılarıyla açık bir şekilde ölçeklendirme.

AFTERtetikleyiciler tetikleyicilerden daha pahalıdır, BEFOREçünkü ifade işini bitirene kadar sıraya alınmalı ve sonra yürütülmelidir. Kuyruk büyürse (en azından 9.4 ve aşağısında, gelecekte değişebilir) diske dökülmezler, bu nedenle büyük AFTERtetik kuyrukları kullanılabilir belleğin aşırı çalışmasına neden olarak ifadenin iptal edilmesine neden olabilir.

Ekleme NEW/ güncelleme işleminden önce satırı değiştiren bir tetikleyici, DML yapan bir tetikleyiciden daha ucuzdur.

İstediğiniz belirli kullanım durumu, FOR EACH STATEMENTtetikleyicilerin sanal OLDve NEWtabloları görebileceği PostgreSQL 9.5'e (şanslıysanız) dönüştürebilecek devam eden bir geliştirmeyle daha iyi performans gösterecektir . Mevcut PostgreSQL sürümlerinde bu mümkün değildir, FOR EACH ROWbunun yerine tetikleyicileri kullanmalısınız.

Bunu daha önce deneyen var mı?

Elbette. Denetim, akıl sağlığı kontrolü vb. İle tetikleyiciler için oldukça standart bir kullanımdır.

Sen içine bakmak isteyeceksiniz LISTENve NOTIFYgörev tabloya değişiklikler olduğunda sizin işçi uyanmak için iyi bir yol.

Harici sistemlerle doğrudan tetikleyicilerden konuşmaktan kaçınarak en önemli şeyi zaten yapıyorsunuz. Bu, performans ve güvenilirlik açısından sorunlu olma eğilimindedir. İnsanlar genellikle doğrudan bir tetikleyiciden posta göndermek gibi şeyler yapmaya çalışırlar ve bu kötü bir haberdir.


1

Biraz gecikmiş bir cevap, ancak gelecekteki okuyucular için yararlı olabilir

Şimdi günler (10,11,12 sürümlerinde) aynı verileri iki kez (PG tarafından WAL'de ve manuel olarak) depolamamız gerekmiyor. Verilerimizdeki tüm değişiklikleri veya bazılarını izlemek için Postgre Mantıksal Kod Çözme mekaniğini (mantıksal çoğaltma ile aynı) kullanabiliriz (veya daha sonra analiz etmek için bu etkinlikleri kafka gibi bir sıraya gönderebiliriz)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.