SORU
30 AĞUSTOS 2012, PERŞEMBE


Nasıl PostgreSQL ekleme performansını hızlandırmak için

İsim ekleme performansını test ediyorum. Veri türü olarak sayı ile bir sütun ile bir tablo var. Bunun da üzerinde bir dizin var. Veritabanı bu sorgu kullanarak doldurdum:

insert into aNumber (id) values (564),(43536),(34560) ...

Çok hızlı bir şekilde 10,000 yukarıdaki Sorgu ile bir anda 4 milyon satır ekledim. Veritabanı 6 milyon satır ulaştıktan sonra performansı büyük ölçüde 1 Milyon satır her 15 dk yapmaktan kaçındı. Ekleme performansını artırmak için herhangi bir hile var mı? Bu proje için en uygun yerleştirme performans ihtiyacım var.

5 GB RAM olan bir makinede Windows 7 Pro kullanarak.

CEVAP
30 AĞUSTOS 2012, PERŞEMBE


PostgreSQL manuel olarak populate a database görmek, depesz's excellent-as-usual article konuyla ilgili, this SO question.

Yapılması gereken çok şey var. İdeal çözüm dizinler olmadan UNLOGGED bir tablo içine al, ve dizinler oturum eklemek için değiştirin. PostgreSQL 9.4 ne yazık ki oturum için UNLOGGED tabloları değiştirme desteği yok. 9.5 ALTER TABLE ... SET LOGGED bunu yapmak için izin ekler.

Eğer toplu almak için veritabanı çevrimdışı duruma, pg_bulkload kullanın.

Aksi takdirde:

  • Herhangi bir tablo üzerinde tetikleyici devre dışı bırakın

  • İthalat, yeniden oluşturmak daha sonra bunları başlamadan önce dizinler bırakın. (Sürerçokaynı verileri aşamalı olarak eklemek için yapar, ve elde edilen endeks çok daha kompakt daha bir geçişte bir dizin oluşturmak için daha az zaman).

  • Eğer tek bir işlem içinde ithalat yaptığını, güvenli yabancı anahtar kısıtlamaları, ithalat ve yeniden işlemeden önce kısıtlamalar bırakın. Geçersiz veri tanıtmak ister gibi ithalat çoklu işlemler arasında bölünmüş ise, bunu yapmayın.

  • Mümkünse, COPY yerine INSERTs kullanın

  • Eğer COPY çok değerli kullanarak düşünün kullanabilirsiniz. INSERTpratik. Zaten bunu yapıyorsunuz. Listesi için çalışmayınçokVALUES ama; bu değerler bir tek pek çok değeri belleğe sığdırmak için birkaç kez üzerinde var, bu yüzden deyim başına birkaç yüz Sakla.

  • Açık hareketler içine ekler toplu, yüz binlerce yapmak veya işlem başına ekler milyonlarca. Pratik sınırı bildiğim kadarıyla yok, ama toplu işleme, bir hatadan kurtarmak giriş verileri her parti başlangıcı işaretleyerek izin verir. Yine, zaten bunu yapıyorsunuz.

  • synchronous_commit=off büyük commit_delay fsync azaltmak için kullanın() maliyetleri. Bu büyük hareketler halinde çalışma toplanmış ettiyseniz pek yardımcı olmaz.

  • INSERT COPY çeşitli bağlantıları paralel. Sizin donanım disk alt sistemi ne kadar bağlı; genel bir kural olarak, eğer doğrudan bağlı depolama kullanarak fiziksel sabit disk için bir bağlantı istiyorum.

  • * *15 yüksek bir değer ayarlayın ve log_checkpoints etkinleştir. PostgreSQL günlükleri bakmak ve kontrol noktaları çok sık görülen şikayet değil emin olun.

  • Eğer ve yalnızca eğer sakıncası yoksa kaybeden tüm küme PostgreSQL (veritabanı ve herhangi bir Diğerleri aynı küme) felaket bozulması durumunda sistem kilitleniyor alma, kesin Pg, set fsync=off başlangıç Pg, ithalat, sonra (hayati) dur Pg ve set fsync=on tekrar. WAL configuration bkz.Eğer zaten PostgreSQL hakkında herhangi bir veritabanında herhangi bir veri varsa bunu yüklemeyin.Eğer fsync=off ayarlarsanız da full_page_writes=off; yine, unutma, geri veritabanı bozulmasını önlemek için ithalat ve veri kaybı sonra açmak için ayarlayabilirsiniz. Pg manuel olarak non-durable settings bkz.

Ayrıca sistem ayarları bakmak gerekir:

  • Kullanıniyi kaliteDepolama mümkün olduğunca için SSD. Güvenilir, güç korumalı geri yazma önbelleğe iyi SSD hızları inanılmaz hızlı bir anlaşma yapmalısınız. Yukarıdaki öneriler fsync()s disketi boşaltır / azaltır - - takip ama hala büyük bir yardım olabilir daha yararlı oluyorlar. Veri tutmak umurumda değil sürece elektrik arıza koruma olmadan ucuz SSD kullanmayın.

  • Eğer RAID 5 veya doğrudan bağlı depolama için RAID 6 kullanıyorsanız, şimdi durdurun. Verilerinizi, software RAID 10, RAID ve tekrar denemek için geri yeniden yapılandırılması. RAID 5/6 büyük bir önbellek ile RAID denetleyicisi iyi bir yardımcı olabilir ama yazma performansı için toplu umutsuz.

  • Eğer pil destekli büyük bir geri yazma önbelleği ile donanım RAID denetleyicisi kullanma seçeneği varsa bu gerçekten işleyen bir sürü iş yükleri için yazma performansı artırabilir. Eğer bir commit_delay ile tamamlama zaman uyumsuz kullanıyorsanız veya toplu yükleme sırasında daha az büyük hareketleri yapıyorsan kadar yardımcı olmuyor.

  • Mümkünse, ayrı bir disk / disk dizisinde WAL (pg_xlog) saklayın. Aynı disk üzerinde ayrı bir dosya sistemi kullanarak küçük bir nokta var. İnsanlar genellikle WAL RAID1 bir çift kullanmak için seçin. Yine, bu yüksek oranları ile taahhüt sistemleri üzerinde daha fazla etkisi vardır, ve eğer veri yüklemek hedef olarak unlogged bir tablo kullanıyorsanız çok az etkisi vardır.

Ayrıca Optimise PostgreSQL for fast testing ilginizi çekebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BumbleDroid

    BumbleDroid

    18 EKİM 2010
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013