내 PostgreSQL 데이터베이스에 여러보기에서 기초로 사용하는 매우 복잡한 SQL 문이 있습니다. 그러나이 문에서는 합계 집계 함수가 여러 번 호출됩니다. 이제 변수를 사용하여 이러한 값을 여러 번 요약하는 것을 제거하여 이러한 뷰를 최적화하려고합니다.
@myvalue = 1을 사용할 수 있다는 것을 알고 있지만 이것은 pgScript에 있으며 pgScript이므로 뷰에서 사용할 수 없습니다.
나는 변수를 저장하기 위해 구성 설정을 남용하는 것에 대해 읽었지만 이것이 뷰에서 어떻게 작동하는지 모르고 그러한 해킹을 정말로 좋아하지 않습니다.
변수에 저장하고 싶은 SQL 부분은 sum(v."Surface")::double precision
여러 번 반복됩니다.
이 SQL을 최적화하기위한 다른 제안이 있다면 나는 그것을위한 것입니다.
CREATE OR REPLACE VIEW mydb."MyTable" AS
SELECT p."Id",
v."FunctionInt",
v."TypeInt",
sum(v."Surface") AS "SurfaceTotaal",
round((sum(v."Surface"::double precision * v."Average") / sum(v."Surface")::double precision)::numeric, 1) AS "Average",
round((sum(v."Surface"::double precision * v."E") / sum(v."Surface")::double precision)::numeric, 1) AS "E",
round((sum(v."Surface"::double precision * v."E1") / sum(v."Surface")::double precision)::numeric, 1) AS "E1",
round((sum(v."Surface"::double precision * v."E2") / sum(v."Surface")::double precision)::numeric, 1) AS "E2",
round((sum(v."Surface"::double precision * v."E3") / sum(v."Surface")::double precision)::numeric, 1) AS "E3",
round((sum(v."Surface"::double precision * v."M") / sum(v."Surface")::double precision)::numeric, 1) AS "M",
round((sum(v."Surface"::double precision * v."M1") / sum(v."Surface")::double precision)::numeric, 1) AS "M1",
round((sum(v."Surface"::double precision * v."M2") / sum(v."Surface")::double precision)::numeric, 1) AS "M2",
round((sum(v."Surface"::double precision * v."M3") / sum(v."Surface")::double precision)::numeric, 1) AS "M3",
round((sum(v."Surface"::double precision * v."G") / sum(v."Surface")::double precision)::numeric, 1) AS "G",
round((sum(v."Surface"::double precision * v."G1") / sum(v."Surface")::double precision)::numeric, 1) AS "G1",
round((sum(v."Surface"::double precision * v."G2") / sum(v."Surface")::double precision)::numeric, 1) AS "G2",
round((sum(v."Surface"::double precision * v."G3") / sum(v."Surface")::double precision)::numeric, 1) AS "G3",
round((sum(v."Surface"::double precision * v."G4") / sum(v."Surface")::double precision)::numeric, 1) AS "G4"
FROM mydb."PTable" p,
LATERAL (
SELECT
v."Id",
v."Surface",
v."FunctionInt",
v."TypeInt",
r."YearGroupInt",
r."Average",
r."En" AS "E",
r."En1" AS "E1",
r."En2" AS "E2",
r."En3" AS "E3",
r."Mi" AS "M",
r."Mi1" AS "M1",
r."Mi2" AS "M2",
r."Mi3" AS "M3",
r."Gz" AS "G",
r."Gz1" AS "G1",
r."Gz2" AS "G2",
r."Gz3" AS "G3",
r."Gz4" AS "G4"
FROM mydb."VTable" v
JOIN mydb."RTable" r ON
v."FunctionInt" = r."FunctionInt"
AND v."TypeInt" = r."TypeInt"
AND v."YearGroupInt" = r."YearGroupInt"
WHERE v."PId" = p."Id") v
GROUP BY p."Id", v."FunctionInt", v."TypeInt";
sum(v."Surface")::double precision
여러 번 계산 된 가정 이 잘못되었습니다. 플래너가 처리하고 직접 테스트합니다.
CREATE TABLE foo AS
SELECT * FROM generate_series(1,1E7) AS t;
그때..
EXPLAIN ANALYZE SELECT sum(t) FROM foo;
이제 두 개로 시도해보세요 (감각 할만한 속도 저하 없음)
EXPLAIN ANALYZE SELECT sum(t), sum(t) FROM foo;
플래너는 상수를 접지 않습니다.
EXPLAIN ANALYZE SELECT sum(t), sum(t+0) FROM foo;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다