나는 행 ~ 160,000,000 많이 들어있는 PostgreSQL 데이터베이스 있습니다. 데이터베이스는 기본적으로 네트워크 로그 집합입니다. 타임 스탬프 인 time이라는 열이 있습니다. 기본적으로 모든 고유 한 시간마다 네트워크의 각 시스템에 대한 로그가 있습니다. 따라서 동일한 타임 스탬프가있는 여러 행이 있습니다. 즉PostgreSQL의 인덱스 성능 문제
time ip value
2:00 192.168.1.1 5
2:00 192.168.1.2 4
2:00 192.168.1.3 5
3:00 192.168.1.1 3
3:00 192.168.1.2 5
3:00 192.168.1.3 2
etc etc
이제이 데이터베이스에 대한 색인을 항상 관련 검색어로 사용하는 입력란으로 만들었습니다. 전체 데이터베이스를 스캔하는 데 인해 쿼리에 모든 쿼리가 약 2 분 소요 인덱스를 사용하지 않고
i.e. select * from networklogs where time = '2:00' and value = 5
. 내 쿼리가 일치하는 시간을 포함하는 데이터의 하위 집합을 찾은 다음 여기에서 다른 값을 기준으로 필터링하므로 쿼리가 훨씬 빨라지기를 기대하는 인덱스를 만들었습니다. 이 이상하다
쿼리 지금이 더 걸릴 것으로 보인다 그러나
는... 때문에 pgAdmin에 쿼리가 시간 인덱스를 사용하는 것으로, 시간 지수는 총 ~ 80 개 항목에 대한 데이터를 좁히는 것을 설명 160,000,000이고 쿼리 필터는이 데이터를 1,700 개 항목으로 좁 힙니다. 이 설명은 17ms 걸리지 만 쿼리를 실행하면 3 분이 걸립니다.
이것은 160,000,000 항목에 두 개의 키워드와 일치하는 검색보다 더 빨리해야합니다!
이 pgAdmin 쿼리를 수행 할 때 실제로 사용 않는 시간 인덱스를 사용하여 같이 쿼리를 설명에도 불구하고, 난 궁금하네요 빨리하지 왜 작동하지 수 있습니까?
는 사람이 어떤 아이디어 나 제안 사항이 있습니까?
감사합니다, 제임스는
는 업데이트 :
explain analyze select latitude,longitude from networklogs where value = 5 and time = '2:00'
결과는 다음과 같습니다 :
"Bitmap Heap Scan on networklogs (cost=13178.17..1488620.94 rows=848 width=19) (actual time=3507.923..278760.509 rows=33 loops=1)"
" Recheck Cond: (time = '2:00'::timestamp without time zone)"
" Rows Removed by Index Recheck: 38302021"
" Filter: (value = 5)"
" Rows Removed by Filter: 882873"
" -> Bitmap Index Scan on timeindex (cost=0.00..13177.95 rows=530111 width=0) (actual time=695.771..695.771 rows=882906 loops=1)"
" Index Cond: (time = '2:00'::timestamp without time zone)"
"Total runtime: 278764.148 ms"
VACUUM ANALYZE를 시도하십시오. – randomguy
감사합니다. 지금 사용해보세요! –
특정 시점의 이전 데이터를 백업하고 최근 데이터를 x만큼만 유지할 수있는 권한이 있습니까? – bonCodigo