2012-03-06 4 views
0

내가 더 많거나 적은 같은 일부 테이블이 관련된 MAX 집계 쿼리 (설명이 명확 그래서 나는 간단한 도메인을 사용합니다) :최적화 다양한 테이블

Trades 
---------- 
ID 
Seller_ID 
Trade_Date 

Sellers 
------- 
ID 
Department_ID 

그리고 난을 얻으려면 각 부서별 최신 교역.

SELECT Department_ID, MAX(Trade_Date) FROM 
Trades, Sellers 
WHERE Trades.Seller_ID = Sellers.ID 
GROUP BY Sellers.Department_ID 

테이블 거래 날짜에 인덱스를 가지고, 그래서 쿼리를 빠르게 할 수 있습니다,하지만 난 (ID를 하드 코딩) 쿼리가 일부 부서에 대한 빠른 실행 것으로 나타났습니다 : 쿼리는 뭔가처럼 다른 사람들에게는 매우 느립니다.

저는 각 부서별로 거래량이 매우 다르기 때문에 이런 추세가 있음을 추측했습니다. 데이터베이스는 정렬 된 색인에 대해 순차적으로 검색을 수행하여 첫 번째 항목을 가져오고 오래 전에 가장 최근에 판매 한 부서는 색인에서 매우 멀리 갈 필요가 있습니다.

현재 해결책은 보조 테이블에 최신 쿼리 결과를 저장하고 새 쿼리를 증분 (보조 테이블에있는 최신 날짜로 필터링)하는 것입니다. 쿼리가 자주 실행되고 인덱스 스캔이 몇 초의 트랜잭션을 고려하면 문제가 해결됩니다.

하지만 이보다 더 우아한 해결책이 있어야한다고 생각합니다. 부서가 아닌 판매자가 집계 한 경우 복합 색인이 명확하게 도움이되지만 다른 테이블을 생성하는 색인을 작성하는 것이 허용되지 않는다고 생각합니다.

+0

당신이 Seller_ID 및 Trade_date에 복합 인덱스를 시도 :

포스트 그레스의 MV를 대한 기사가있다? 또한 두 테이블의 레코드 수는 어떤 종류입니까? –

+0

나는 그것을 검사했고 이미 현재 스키마에 그런 색인이있다. 이 숫자는 주당 약 3 백만 건입니다. 쿼리는 몇 초 걸리지 만 거의 즉각적입니다. – fortran

+0

그런 종류의 데이터 및 쿼리 응답 요구 사항을 사용하면 기존 방식이 나에게 가장 잘 보입니다.하지만 다른 사람이 더 좋은 아이디어를 가지고있을 수 있습니다 ... –

답변

1

구체화 된 또는 여러분이 직접 포스트 그레스 (postgres)를 사용한다면? 만약 insert 연산이 select만큼 시간적으로 중요하지 않다면이 방법을 고려할 것입니다.

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views

+0

불행히도 인서트가 훨씬 더 중요합니다! 삽입 성능이 너무 떨어지도록하고 싶지 않습니다. – fortran

+0

거래 테이블에 삭제 또는 업데이트가 있습니까? – wildplasser

+0

당신은 당신을 위해 그렇게하는 직업과 같은 것을 생각해 봤습니까 (즉, 30 초마다 업데이트되는 결과를 나타내는 테이블을 의미합니까)? PostgreSQL이 트리거와 함께 직접 이러한 기능을 구현하는 자율 트랜잭션에 대한 정보를 찾을 수 없습니다 (이와 비슷한 기능을 지원하지 않는 것 같습니다). 알림 시스템을 살펴볼 수도 있습니다. http://postgresql.1045698.n5.nabble.com/Invoke-trigger-after-commit-td1881023.html – Eggi