2016-09-20 1 views
0

데이터가있는 측정 데이터가있는 테이블, connected_id (센서) 및 타임 스탬프가 있습니다. 이 표에서 특정 센서의 첫 번째 타임 스탬프를 찾습니다. 일부 센서의 경우 2ms의 결과가 나오고 다른 센서의 경우 몇 초가 걸립니다. 또한 특정 센서를 검색하는 where 조건을 제거하면 그 결과는 ms 이내입니다.다른 성능을 가진 동일한 postgresql 쿼리

screen shot with <code>EXPLAIN ANALYZE</code> output

두 쿼리는 동일한 계획을 사용, PostgreSQL의 8.4을 사용하여 동일한 서버에서 실행됩니다. 이미 데이터베이스에서 진공 분석을 수행하고 postgresql.conf 파일의 쿼리 계획을 가지고 놀았습니다.

작성한 connected_id와이 두 열 모두에서 btree 및 hash 인덱스를 모두 사용해 보았습니다. 이것은 아무런 차이가 없습니다.

+6

텍스트를 캡쳐하지 말고 여기에 텍스트로 붙여 넣으십시오. – oals

+0

인덱스'data_index'는 어떻게 정의되어 있습니까? – donkopotamus

+0

또한 데이터 볼륨에 따라 다릅니다. 두 조건 집합에 대해'count (*)'는 무엇을 반환합니까? – Rahul

답변

0

선택한 쿼리 계획이 created으로 정렬 된 인덱스를 오름차순으로 검색하고 connected_id과 일치하는 첫 번째 행을 찾으면 중지합니다.

이제는 의 행에 created이 있으므로 일치하는 항목을 빠르게 찾을 수 있습니다.

그러나 확실히 connected_id = 26 인 모든 행은 다소 높은 created이므로 일치 항목이 발견되기 전에 쿼리가 많은 인덱스 항목을 검색해야합니다.

그 차이점을 설명합니다.
최근에 지원되지 않은 PostgreSQL 버전을 사용하지 않은 경우 EXPLAIN (BUFFERS)과 같은 상황을 표시하는 데 더 많은 진단을 사용할 수 있습니다.

이 쿼리의 속도를 높이려면 (connected_id, created)에 여러 열 인덱스를 만듭니다.

+0

답장을 보내 주셔서 감사합니다. 나는 (created, connected_id)에 다중 컬럼 인덱스를 시도했다. connected_id의 첫 번째 주문은 의미가 있습니다. 시도하고 결과를 알려 드리겠습니다. – slonkie

관련 문제