Postgresql tek bir iplik ile bir süreçtir tek arka uç her bir sorgu çalıştırır. Bir sorgu için birden fazla CPU kullanamaz. Aynı zamanda I/O eşzamanlılığının tek bir sorguda elde edebileceği, sadece bitmap dizin taramaları için eşzamanlı I/O yapan ve eşzamanlı I/O için işletim sistemi ve disk sistemine dayanan bir şekilde sınırlı.
Pg, birçok küçük sorgunun eşzamanlı yüklerinde iyidir ve sisteminizi bu şekilde doyurmak çok kolaydır, bir ya da iki büyük sorgu için sistem kaynaklarını en iyi şekilde kullanmak iyi değildir. parçalar halinde yukarı işi bölünmüş ve işçilere elden teslim edilir Ne yapabilirsiniz
. Tüm kullanılabilir CPU kullanan, postgre aynı anda farklı satırlar için paralel yılında GetStatistic hesaplamak almak için
i değiştirebilir sorgusu: Sen bu ima ettik?
DBlink, PL/Proxy, pgbouncer ve işin bu tür yardımcı olmak üzere tasarlanmıştır PgPool-II gibi çeşitli araçlar vardır. Alternatif olarak, her biri veritabanına bağlanan ve birbiriyle örtüşmeyen ID aralıklarına sahip UPDATE ... WHERE id BETWEEN ? AND ?
ifadeleri yapan 8 işçiyi başlatabilirsiniz. Daha sofistike bir seçenek, bir kuyruk kontrolörünün, çalışanlara yaklaşık 1000 ID değerine sahip menzilleri vermesidir. Bu aralıktaki UPDATE
o zaman yeni bir tane isteyin. 64 CPU'lar 64 eşzamanlı işçiler idealdir anlamına gelmez
Not. Disk G/Ç'niz, yazım söz konusu olduğunda da bir faktördür. Eğer bir commit_delay
kullanmak üzere UPDATE
işlemleri ayarlamak ve (bu veriler için iş gereksinimleri için güvenli değilse) synchronous_commit = 'off'
sonra senkronize edilmez yük önemli ölçüde azaltılmalıdır eğer I/O maliyeti biraz yardımcı olabilir. Yine de, 'muhtemelen en iyi iş çıkışı 64 eş zamanlı çalışanın çok altında gerçekleşecek.
Büyük olasılıkla, GetStatistic
işlevinizin, büyük olasılıkla bir döngü ağır yordamsal PL/pgSQL işlevinin şu anda ne olduğundan ziyade, bir SQL işlevine veya görünümüne dönüştürerek çok daha hızlı yapılabilmesi olasıdır. Bu işlevi gösterdiğinizde yardımcı olabilir.
Neden bir işlev kullanın, düz SQL tarafından gerçekleştirilemeyen bir şey var mı? İşlev sadece geçerli satırdan değerlere mi ihtiyaç duyar, yoksa diğer veri kaynaklarını da içerir mi (: = tablo)? Btw: bize işlevi gösterir. – wildplasser
Bu sorgunun planını kontrol edin, bu işlevin 10M kere çağrıldığını göreceksiniz. Belki de onu salt SQL'e yazmak daha iyi olurdu ve daha hızlı olabilirdi. –