2017-11-12 7 views
0

디지털 오션 서버에 데이터베이스가 있는데 가끔 느린 것 같습니다 (때로는 1 초 이상). postgis가있는 Postgresql이 실행 중입니다.Postgis 최적화 쿼리 및 성능 이해


하우스 : 지난 24 시간 동안 온라인왔다 190000

SELECT count(*) from houses; 

하우스 : 58000

여기

실제로 그냥 아파트를 저장하는 데이터베이스 주택에 대한 통계입니다
SELECT count(*) FROM houses 
JOIN (select max(last_seen) as last_ts from houses) as dt 
ON last_seen >= dt.last_ts - interval '24 hour'; 

특정 지역에 있고 활동중인 주택 : 3086

select count(*) from houses 
where ST_DWithin(geom, ST_MakePoint(52.5277411, 13.4)::geography,30000) 
       (active IS NULL OR active = TRUE) 

여기에 조금 느린 실제 SQL 쿼리입니다. 느린는 하나 개의 쿼리 때로는 더 다음 일초 소요 의미

SELECT 
     *, 
     ST_DistanceSphere(geom, ST_MakePoint(52.5277411, 13.4)) as distace 
     FROM houses 
     JOIN (select max(last_seen) as last_ts from houses) as dt 
     ON last_seen >= dt.last_ts - interval '24 hour' 
     WHERE 
     ST_DWithin(geom, ST_MakePoint(52.5277411, 13.4)::geography,30000) 
     AND (active IS NULL OR active = TRUE) 

내가 지금까지 시도 무엇. 약간의 중복이기 때문에 조인을 제거하십시오. 색인을 소개하십시오. 그

enter image description here

어떤 생각을 개선 할 수있는 방법 : 여기

쿼리의 설명이다? 고마워요!

추신 : 일부 데이터가 누락되었습니다. 알려 주시면 알려 드리겠습니다. 많은 사람들이 도움을 시도하고 내 최종 솔루션을 게시 할 정말 좋은 조언을 준 이후 enter image description here

+1

0) 계획이 * * * bad ... 1) 질문에 DDL을 추가하지 않습니다. 2) geom에 공간 인덱스가 있습니까? 3)'EXPLAIN' 대신'EXPLAIN ANALYZE'를 입력하십시오. – wildplasser

+0

안녕하세요. geom에 공간 인덱스가 있습니다. 질문에 EXPLAIN ANLYZE를 사용하여 쿼리와 인덱스를 첨부했습니다. 그것을 살펴 줘서 고마워. – MichaelRazum

+0

BTW : 대부분의 경우, 부울 열을 NULL 가능으로 정의하는 것은 의미가 없습니다. 'AND (활성 IS NULL 또는 활성 = TRUE)'(여기에서 조건부 색인을 고려할 수 있음) – wildplasser

답변

1

: 을 언급 한 바와 같이 enter image description here

데이터베이스 지수 : 여기

와 같은 분석 설명 의견에서 항상 측정, 최적화, 반복해야합니다. 테이블 크기와 인덱스가 주요 포인트입니다. 나는이 주제 시각화에 대한 전문가가 아니에요 이후

기본적인 이해를 도왔다 http://tatiyants.com

Explain (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) 
select 
    *, 
    ST_DistanceSphere(geom, ST_MakePoint(52.5277411, 13.4)) as distace 
    FROM houses 
    JOIN (select max(last_seen) as last_ts from houses) as dt 
    ON last_seen >= dt.last_ts - interval '24 hour' 
    WHERE 
    ST_DWithin(geom, ST_MakePoint(52.5277411, 13.4)::geography,30000) 
    AND (active IS NULL OR active = TRUE); 

query visualisation

에 많은 도움이되었습니다. 이미 색인을 사용하고 있었기 때문에 가능한 많은 최적화가 없었습니다. 제 경우에는 조금 지연된 결과를 얻는 것이 좋았습니다. 쿼리의 일부를 저장하는 구체화 된 뷰를 소개합니다.

CREATE MATERIALIZED VIEW mathouses 
select 
    *, 
    FROM houses 
    JOIN (select max(last_seen) as last_ts from houses) as dt 
    ON last_seen >= dt.last_ts - interval '24 hour' 
    WHERE (active IS NULL OR active = TRUE); 

그런 다음 인덱스를 추가했습니다.

#!/bin/sh 
sudo -u <myuser>-Hi -- psql -d <db> -c 'refresh materialized view mathouses;' 

내 최종 결과 : 솔루션과

Explain (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) 
select 
    *, 
    ST_DistanceSphere(geom, ST_MakePoint(52.5277411, 13.4)) as distace 
    FROM mathouses 
    WHERE ST_DWithin(geom, ST_MakePoint(52.5277411, 13.4)::geography,30000); 

query visualisation

예쁜 행복 그리고 크론에 의해 매 시간마다 호출되는 간단한 쉘 스크립트를 추가했다. 지금은 3 배 이상 빨라졌습니다. 다음 논리적 인 단계는 하드웨어를 보거나 postgresql 설정을 최적화하는 것입니다.