Postgres는 모든 행을 스캔하지 않고 그룹별 최대 쿼리를 최적화할 수 있습니까?
Postgres에는 그룹 쿼리를 효율적으로 최대화하는 직접적인 접근 방식이 부족합니다. 주어진 환경에서 비용이 많이 드는 전체 테이블 스캔이 관찰되었습니다. query.
솔루션
과도한 스캔을 방지하려면 옵션 조회 테이블을 활용하고 option_id를 통해 레코드 테이블에 연결하는 것이 좋습니다. 이러한 테이블 사이에 외래 키 제약 조건을 설정하면 참조 무결성이 유지됩니다.
SQL FOR LOOKUP TABLE CREATION:
CREATE TABLE options ( option_id int PRIMARY KEY , option text UNIQUE NOT NULL );
기존 레코드에서 데이터 삽입 테이블:
INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;
하위 쿼리를 사용하여 최적화된 쿼리:
SELECT option_id, (SELECT max(id) FROM records WHERE option_id = o.option_id) AS max_id FROM options o ORDER BY 1;
또는 최적화된 하위 쿼리는 최대 ID를 검색할 수 있습니다:
SELECT option_id, (SELECT id FROM records WHERE option_id = o.option_id ORDER BY id DESC NULLS LAST LIMIT 1) AS max_id FROM options o ORDER BY 1;
최적 쿼리 인덱스 성능:
CREATE INDEX ON records (option_id, id DESC NULLS LAST);
이 최적화된 접근 방식은 조회 테이블과 기본 테이블 모두에 대해 인덱스 스캔 또는 인덱스 전용 스캔을 활용하여 쿼리 실행을 크게 향상시켜 전체 테이블 스캔에 비해 뛰어난 성능을 제공합니다. .
위 내용은 Postgres는 전체 테이블 스캔 없이 Groupwise MAX 쿼리를 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!