PostgreSQL işlem dilleri yükü (plpython / plsql / pllua…)


12

Gerçek zamanlı görevler için yordamsal diller performansında PostgreSQL kullanıcı tanımlı işlevleri hakkında bilgi bulmaya çalışıyorum .

  1. Yerleşik işlevlerle nasıl karşılaştırılır?
  2. Postgres nasıl plpython vs plpgsql vs pllua fonksiyonları (ek yük / bağlam / veri aktarım tarafı ile ilgileniyorum, VM kendisi değil) arama / yönetmek herhangi bir fark var mı?
  3. Bağlam büyük bir yük mü? Gerçek zamanlı veri eşlemesi için kullanabilir miyim (diyelim 1000 sorgu)
  4. Plpgsql'de diğer pg / dilden sonra kullanıcı tanımlı işlevler yazmanın herhangi bir faydası var mı? Açık belgeler ise, avantaj numaralandırmak, ama hepsi postgresql prosedürel diller için geçerlidir düşünüyorum.

İlgili bulgular:

Yanıtlar:


13
  1. Yorumlanan dillerdeki UDF'ler, C veya yerleşik işlevlerle yazılmış UDF'lerden her zaman daha yavaştır, diğer tüm şeyler aynıdır.

  2. Her dil bağlaması, farklı optimizasyon dereceleri, bazı veri türlerini iletmenin farklı yolları vb.Ile PostgreSQL'i dile bağlamak için farklı bir koda sahiptir. Bir dilden diğerinden çok farklı bir işleme sahip olan bir veri türünü geçmediğiniz sürece büyük olmamalıdır, örneğin biri hstoredize olarak a geçirir ve diğeri bunu a'ya dönüştürür dict.

  3. "Bağlamın" ne olduğu net değil. "Gerçek zamanlı veri eşleme" için kullanabilir misiniz ... iyi, işlevin ne yaptığına ve üzerinde çalıştığı sunucuda, aldığı istemcilerde ve gereksinimleriniz için yeterince hızlı olup olmadığına bağlıdır. Bir ip parçası ne kadardır? Benchmark.

  4. PL / PgSQL'in yazılması daha basittir ve SQL'e daha hızlı erişim sağlar. Çok fazla SQL'in etrafına küçük bir mantık sarmanız gerektiğinde genellikle daha iyidir. Matematiksel işlemler ve karmaşık algoritmalar için çok yavaştır, bu nedenle PL / PgSQL'deki tamamen hesaplama kodundan mümkün olduğunca C veya daha hızlı bir prosedür dili lehine kaçınılmalıdır.

C / PL / PgSQL kodunu yeniden uygularken hızlanmalar ihmal edilebilirden 1000 kattan fazlaya değişebilir. Her şey kodun gerçekte ne yaptığına bağlıdır.

(Bu tür bir çoklu soru, kesin bir cevaba sahip olmak zor olduğu için Stack Exchange için uygun değildir)


Bağlam gereği, prosedürel bir ortama
Robert Zaremba

4

bunu söylemek oldukça zor. bu gerçekten ne yaptığınıza bağlıdır. Örneğin: PL / pgSQL, içinde büyük SQL ifadeleri varsa harikadır - her türlü dallanma, alt dize yönetimi ve her şeye sahipseniz gerçekten çıldırır.

gerçekten durumdan duruma test etmek zorundasınız.


4

Bağlam büyük bir yük mü? Gerçek zamanlı veri eşlemesi için kullanabilir miyim (diyelim 1000 sorgu)

Performans, donanımınızın ve işlevlerinizin karmaşıklığına bağlıdır. Küçük bir 12 çekirdekli sunucuda ve bir FusionIO kartında (toplam maliyet 10000 Euro) çalışan ve aynı anda 20 kullanıcıyla saniyede 2500 işlem gerçekleştiren bir cihaz oluşturdum. Her işlem, verileri işlemek ve istemciye bazı yararlı bilgileri döndürmek için 29 saklı yordamı çağırır. Bazı işlevler yalnızca bir sorgu yürütürken, diğerleri birkaç sorgu yürütür. Toplamda saniyede yaklaşık 200000 INSERT, SELECT ve UPDATE ifadeleri yürütür.

Tüm bunlar PL / SQL, PL / pgSQL ve PL / PerlU ile yazılmıştır. Ve eminim ki (bazı) fonksiyonlar C ile yeniden yazıldığında sistem daha da hızlı çalışabilir.

Bu cihazda, çoğu performans SSD karttan gelir. Tek bir döner diskte asla bu performansı elde edemeyiz. Ucuz SSD sürücüler de başarısız olur, bir saat boyunca çalışır (baskın kartının önbelleğe alınması nedeniyle) ve daha sonra oyun biter. FusionIO kartı pahalıdır, ancak IO'ya bağlı olduğunuzda çok iyi bir yatırımdır.

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.