PostgreSQL'i birçok INSERTS ve bytea güncellemesi için optimize edin


12

Sahip olduklarımız (yazılım):

  • Temel yapılandırmalı PostrgeSQL 9.3 (değişiklik yok postgresql.conf)
  • Windows 7 64 bit

Donanım:

  • Intel Core i7-3770 3,9 Ghz
  • 32 Gb RAM
  • WDC WD10EZRX-00L4HBAta Sürücü (1000 Gb, SATA III)

Yani, DB aproks içine yüklemek zorundayız. 100.000.000 sıra bytea sütunu ve daha basit 500.000.000 sıra ( LOB içermeyen). 2 var varchar1 masaya (13 ile 19 uzunluk) endeksler ve 2 varchar2. tablo (18, 10 uzunlukları) üzerine endeksler. Her tablo için kimlik oluşturma dizileri de vardır.

Şimdiye kadar bu işlemler 50 JDBC toplu iş boyutuna paralel olarak 8 bağlantı ile yapılıyor. Aşağıdaki resim sistem yükünü göstermektedir: postgresqlişlemlerdeki sıfır yüktür . 24 saatlik yükleme sonrasında sadece 10.000.000 sıra yükledik, bu da çok yavaş sonuç.

resim açıklamasını buraya girin

PostrgreSQLYapılandırmanın ayarlanmasında aşağıdaki amaçlarla yardım istiyoruz :

1) Bu miktarda veriyi ultra hızlı yüklemek için, sadece bir kez işlemdir, bu nedenle geçici yapılandırma olabilir

2) birleştirmeden ve sıralama yapmadan dizinlerine göre bu 2 tabloya az sayıda SELECT yapmak için üretim modu için.

Yanıtlar:


14

İçin insertperformans, bkz PostgreSQL performans eki hızlandırmak ve PostgreSQL toplu eki .

JDBC için harmanlama ile zamanınızı boşa harcıyorsunuz insert. PgJDBC inserttoplu işlerde kullanışlı bir şey yapmaz , sadece her ifadeyi çalıştırır . <- Bu, artık gidiş-dönüş sürelerini önemli ölçüde azaltmak için hazırlanmış ifadeleri toplu hale getirebilen yeni PgJDBC sürümlerinde artık geçerli değil. Ama yine de daha iyi:

COPYBunun yerine kullanın ; bkz. PgJDBC toplu kopyası ve CopyManager. Eşzamanlı yükleyici sayısına gelince: İşlemler disk G / Ç bağlıysa, disk başına birkaç tane hedefleyin. Sekiz muhtemelen en çok isteyeceksin.

"Üretim modunuz" için bir örnek veri yüklemenizi, çalıştırmayı beklediğiniz sorguları ayarlamanızı ve explain analyzeperformansı araştırmak için kullanmanızı öneririm . Yalnızca test amacıyla, enable_farklı plan seçimlerini keşfetmek için parametreleri kullanın. Sorgu planlayıcısı maliyet parametrelerini (Set random_page_cost, seq_page_cost, effective_cache_sizeuygun şekilde sistem için, vs) ve emin olmak shared_buffersuygun şekilde ayarlanır. auto_explainModülü, log_min_duration_statementayarı, pg_stat_statementsuzantıyı vb. Kullanarak simüle edilmiş bir üretim iş yükü eklerken izlemeye devam edin .

Ayrıntılar için PostgreSQL kullanım kılavuzuna bakın. explain analyzeSorgu yürütme ayrıntıları vb. İle ilgili daha somut bir sorununuz olduğunda buraya gelmenizi öneririm .


1
Bu hayret verici bir cevap! Teşekkür.
Jan Mares
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.