내가 더 많거나 적은 같은 일부 테이블이 관련된 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를 하드 코딩) 쿼리가 일부 부서에 대한 빠른 실행 것으로 나타났습니다 : 쿼리는 뭔가처럼 다른 사람들에게는 매우 느립니다.
저는 각 부서별로 거래량이 매우 다르기 때문에 이런 추세가 있음을 추측했습니다. 데이터베이스는 정렬 된 색인에 대해 순차적으로 검색을 수행하여 첫 번째 항목을 가져오고 오래 전에 가장 최근에 판매 한 부서는 색인에서 매우 멀리 갈 필요가 있습니다.
현재 해결책은 보조 테이블에 최신 쿼리 결과를 저장하고 새 쿼리를 증분 (보조 테이블에있는 최신 날짜로 필터링)하는 것입니다. 쿼리가 자주 실행되고 인덱스 스캔이 몇 초의 트랜잭션을 고려하면 문제가 해결됩니다.
하지만 이보다 더 우아한 해결책이 있어야한다고 생각합니다. 부서가 아닌 판매자가 집계 한 경우 복합 색인이 명확하게 도움이되지만 다른 테이블을 생성하는 색인을 작성하는 것이 허용되지 않는다고 생각합니다.
당신이 Seller_ID 및 Trade_date에 복합 인덱스를 시도 :
포스트 그레스의 MV를 대한 기사가있다? 또한 두 테이블의 레코드 수는 어떤 종류입니까? –
나는 그것을 검사했고 이미 현재 스키마에 그런 색인이있다. 이 숫자는 주당 약 3 백만 건입니다. 쿼리는 몇 초 걸리지 만 거의 즉각적입니다. – fortran
그런 종류의 데이터 및 쿼리 응답 요구 사항을 사용하면 기존 방식이 나에게 가장 잘 보입니다.하지만 다른 사람이 더 좋은 아이디어를 가지고있을 수 있습니다 ... –