Ben Aşağıdaki tablo boyutları ile buPostgreSQL: Korkunç yavaş SİPARİŞ anahtar sipariş olarak birincil anahtarla TARAFINDAN
gibi bir model: Şimdi
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 8k |
| DOCUMENT | 150k |
| TRANSLATION_UNIT | 14,5m |
| TRANSLATION | 18,3m |
+------------------+-------------+
aşağıdaki sorgu
select translation.id
from "TRANSLATION" translation
inner join "TRANSLATION_UNIT" unit
on translation.fk_id_translation_unit = unit.id
inner join "DOCUMENT" document
on unit.fk_id_document = document.id
where document.fk_id_job = 11698
order by translation.id asc
limit 50 offset 0
yaklaşık yaklaşık 90 alır Sonlandırmak için. SİPARİŞ BY ve LIMIT maddelerini kaldırdığımda, 19.5 saniye alır. ANALYZE, sorguyu yürütmeden hemen önce tüm tablolarda çalıştırılmıştı.
bu özel terimi, bu kriterleri karşılayan kayıtların sayılardır:
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 1 |
| DOCUMENT | 1200 |
| TRANSLATION_UNIT | 210,000 |
| TRANSLATION | 210,000 |
+------------------+-------------+
sorgu planı:
İLE SİPARİŞ olmayan modifikasyon için sorgu planı ve LIMIT, here'dur.
Veritabanı parametreleri:
PostgreSQL 9.2
shared_buffers = 2048MB
effective_cache_size = 4096MB
work_mem = 32MB
Total memory: 32GB
CPU: Intel Xeon X3470 @ 2.93 GHz, 8MB cache
herkes bu sorgu ile sorun nedir görebilir mi?
GÜNCELLEME: TARAFINDAN SİPARİŞ olmadan aynı sorgu için Query plan (ama yine de SINIR maddesi ile).
nasıl Postgre'nin için optimiser çalışır? Örneğin, seçimlerinizden birini seçebilir ve iyimser olmaksızın bunu ikiye katlayabilir misiniz? – Paul
Şanslı bir tahmin. Birleştirmedeki tümceyi taşımayı deneyebilir misin? Bu durumda, '' 'ile' '' kelimesini değiştirin. – foibs
@foibs: Bu herhangi bir fark yaratmayacak. Postgres optimize edici, her iki versiyonun da aynı olduğunu tespit edecek kadar akıllıdır. –