내가 가진 다음 표 크기가이PostgreSQL의 : 몹시 느린 ORDER 키 순서로 기본 키 BY
같은 모델 : 지금
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 8k |
| DOCUMENT | 150k |
| TRANSLATION_UNIT | 14,5m |
| TRANSLATION | 18,3m |
+------------------+-------------+
다음 쿼리
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
약 90 초 nds을 끝내십시오. ORDER BY 및 LIMIT 절을 제거하면 19.5 초이 걸립니다. ANALYZE은 쿼리를 실행하기 직전에 모든 테이블에서 실행되었습니다.
이 특정 쿼리의 경우, 이러한 기준을 만족하는 레코드의 숫자 :
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 1 |
| DOCUMENT | 1200 |
| TRANSLATION_UNIT | 210,000 |
| TRANSLATION | 210,000 |
+------------------+-------------+
쿼리 계획 :
BY ORDER없이 수정에 대한 쿼리 계획 LIMIT은 here입니다.
데이터베이스 매개 변수 :
이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
사람이 쿼리에 어떤 문제가 있는지 볼 수 있을까요?
UPDATE : BY ORDER없이 동일한 쿼리에 대한 Query plan (여전히 LIMIT 절).
어떻게 Postgre에 대한 최적화 작업? 예를 들어 선택에서 선택할 수 있습니까? 그리고 옵티 마이저가 두 번 열리지 않고 주문할 수 있습니까? – Paul
그냥 운 좋은 추측. 조인에서 where 절을 이동할 수 있습니까? 이 경우'where'를'and'로 바꿉니다. – foibs
@foibs : 아무런 차이가 없습니다. Postgres 옵티마이 저는 두 버전이 동일하다는 것을 감지 할만큼 똑똑합니다. –