안녕하세요?
테이블 대사작업 속도가 나지 않아서 대사 쿼리를 수정했는데...
explain (analyze, buffers) 하고 SQL 수행하면, 13 sec 걸리는데
explain (analyze, buffers) 제거하고 SQL 수행하면, 22 sec 걸립니다.
PostgreSQL 13.1 / EDB 12.4 에서 동일 현상 발생합니다.
아래는 테스트 쿼리 입니다.
parameter 값은 모두 default 설정입니다.
DROP TABLE T1;
CREATE TABLE T1 AS
SELECT ROW_NUMBER() OVER () as C1
, oid, relname, relnamespace, relpages, reltuples, relhasindex, relisshared,relhasrules
FROM pg_class, (SELECT i FROM generate_series(1, 10000) a(i)) A;
drop table t2;
CREATE TABLE T2 AS
SELECT C1, OID
,CASE WHEN C1 != 11 THEN RELNAME ELSE 'DIFFERENT' END RELNAME
, RELNAMESPACE
, CASE WHEN C1 !=8 THEN RELPAGES ELSE 777 END RELPAGES
, RELTUPLES, relhasindex, relisshared,relhasrules
FROM T1
WHERE MOD(C1,5139999) != 0;
--아래와 같이 NOT EXISTS를 이용하면 PARALLEL PROCESSING을 이용할 수 있다.
(full outer join은 parallel processing 미지원)
explain (analyze,buffers)--explain 을 넣고 수행하면 약 13초 소요되나, explain 빼고 수행하면 약 22초
SELECT *
FROM T1 A
WHERE NOT EXISTS (SELECT 1
FROM T2 B
WHERE A.C1 = B.C1
AND A.OID = B.OID
AND A.RELNAME = B.RELNAME
AND A.RELNAMESPACE = B.RELNAMESPACE
AND A.RELPAGES = B.RELPAGES
AND A.RELTUPLES = B.RELTUPLES
AND A.RELHASINDEX = B.RELHASINDEX
AND A.RELISSHARED = B.RELISSHARED
AND A.RELHASRULES = B.RELHASRULES)
UNION ALL
SELECT *
FROM T2 B
WHERE NOT EXISTS (SELECT 1
FROM T1 A
WHERE A.C1 = B.C1
AND A.OID = B.OID
AND A.RELNAME = B.RELNAME
AND A.RELNAMESPACE = B.RELNAMESPACE
AND A.RELPAGES = B.RELPAGES
AND A.RELTUPLES = B.RELTUPLES
AND A.RELHASINDEX = B.RELHASINDEX
AND A.RELISSHARED = B.RELISSHARED
AND A.RELHASRULES = B.RELHASRULES);
|