2017-04-25 2 views
0

저는 Python Django를 사용하여 postgresql db에 측정 데이터를 저장하려고합니다. 지금까지 모두 좋았습니다. django로 도커 컨테이너를 만들었고, postgresql 서버로 도커 컨테이너를 만들었습니다. 그러나 측정 테이블에서 2M 행에 가까워지고 쿼리가 실제로 느려지 기 시작합니다. 그 이유는 확실하지 않지만 매우 집중적 인 쿼리를 수행하지는 않습니다. 예PostgreSQL 쿼리 속도가 느립니다. 무엇이 문제입니까?

이 쿼리

SELECT ••• FROM "measurement" WHERE "measurement"."device_id" = 26 ORDER BY "measurement"."measure_timestamp" DESC LIMIT 20 

제가 질의하는 장치에 따라 실행하는 3 내지 5 초 걸린다.

내가 더 멋진 일을하지 않기 때문에 나는 이것이 훨씬 더 빨리 달릴 것으로 기대한다. ID 및 measure_timestamp에 인덱스를 이용한 측정 테이블

id INTEGER 
measure_timestamp TIMESTAMP WITH TIMEZONE 
sensor_height INTEGER 
device_id INTEGER 

. 서버가 너무 바빠 보이지 않습니다. 512M 메모리 일지라도 쿼리 중에 많은 시간이 남아 있습니다.

shared_buffers = 256MB 및 work_mem = 128MB로 postgresql 서버를 구성했습니다. 총 데이터베이스가 100MB 미만이므로 쉽게 맞아야합니다. PgAdmin에서 쿼리를 실행하면 많은 수의 I/O가 표시되므로 디스크에서 읽어야 할 것으로 의심됩니다. 이는 분명히 느립니다.

아무도 올바른 방향으로 몇 가지 방법으로 문제를 찾을 수 있습니까?

EDIT : 쿼리에 대한 explain 분석 결과가 추가되었습니다. device_id에 인덱스를 추가했는데 많은 도움이되었습니다.하지만 쿼리 시간이 더 빨라질 것으로 예상됩니다. https://pastebin.com/H30JSuWa

+4

쿼리에'EXPLAIN (ANALYZE, BUFFERS)'를 실행하고 질문에 결과를 추가하십시오. 그것은 추측에 근거하지 않은 답을주는 데 도움이 될 것입니다. –

+0

또한 PK FK 및 색인을 포함하여 테이블 정의를 질문에 추가하십시오. 그리고 카디널리티와 같은 데이터의 일부 discription. – joop

답변

1

indexesmeasure_timestampdevice_id이 있습니까? 검색어가 항상 해당 양식을 사용하는 경우 multi-column indexes을 좋아할 수도 있습니다.

+0

글쎄,하지만 분명히 device_id에, 그래서 그것을 고정 생각, 그리고 많은 도움이되었지만, 나는 아직 거기에, 난 훨씬 빨리 얻을 수 있다고 생각 해요. – Marcovannoord

+0

검색어가 내림차순으로 정렬됩니다. 같은 방식으로 인덱스를 만들려고합니까? https://www.postgresql.org/docs/current/static/indexes-ordering.html – Jayadevan

+0

그 대답에서 언급 된 다른 것들과 함께 트릭을 만들었습니다. 나는 인덱스가 "편도"라는 것을 알지 못했고 인덱스를 내림차순으로 인덱스 할 수있었습니다. Querytime은 5 초에서 22ms로 변경되었습니다. 감사! – Marcovannoord

1

테이블의 배포 키를 확인하십시오. 데이터가 희박하게 분포되어 성능에 영향을 미칠 수 있습니다. 2M 레코드의 데이터를 가지고있을 때 적절한 분배 키를 선택하는 것은 매우 중요합니다. 더 자세한 내용은 다음을 참조하십시오 on why distribution key is important

관련 문제