2021. 11. 26. 08:17ㆍIT
PostgreSQL에서 Table을 Alter 했을 때 속도를 테스트 해보자.
1. 파티션 테이블을 만든다
CREATE TABLE test(
No INTEGER,
ID BIGINT,
Sigma NUMERIC(22,2),
AddTime TIMESTAMP
) PARTITION BY RANGE (Addtime);
2. 7일짜리 Range Partition을 생성한다.
CREATE TABLE test_20211101 PARTITION OF test FOR VALUES FROM ('20211101') TO ('20211102');
CREATE TABLE test_20211102 PARTITION OF test FOR VALUES FROM ('20211102') TO ('20211103');
CREATE TABLE test_20211103 PARTITION OF test FOR VALUES FROM ('20211103') TO ('20211104');
CREATE TABLE test_20211104 PARTITION OF test FOR VALUES FROM ('20211104') TO ('20211105');
CREATE TABLE test_20211105 PARTITION OF test FOR VALUES FROM ('20211105') TO ('20211106');
CREATE TABLE test_20211106 PARTITION OF test FOR VALUES FROM ('20211106') TO ('20211107');
CREATE TABLE test_20211107 PARTITION OF test FOR VALUES FROM ('20211107') TO ('20211108');
3. 파티션이 잘 만들어 졌는지 확인
SELECT relname AS "relation",
pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_tables A, pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
AND C.relkind <> 'i'
AND A.tablename = C.relname
AND nspname !~ '^pg_toast'
and relname like 'test%'
ORDER BY pg_total_relation_size(C.oid) desc
4. 데이터 밀어 넣기
700만건을 밀어 넣는 function을 만들었다
DROP FUNCTION IF EXISTS insert_fn;
CREATE OR REPLACE FUNCTION insert_fn(
INOUT poStatus BIGINT
)
LANGUAGE plpgsql
AS $$
DECLARE lCount BIGINT;
BEGIN
-- ----------------------------------------------------------------
-- Check parameter
-- ----------------------------------------------------------------
lCount := 0;
WHILE lCount < 7000000
LOOP
INSERT INTO test(no, id, sigma, addtime)
values(
lCount,
lCount + 1,
lCount + 2,
(CASE WHEN lCount < 1000000 THEN '2021-11-01'::TIMESTAMP
WHEN lCount < 2000000 THEN '2021-11-02'::TIMESTAMP
WHEN lCount < 3000000 THEN '2021-11-03'::TIMESTAMP
WHEN lCount < 4000000 THEN '2021-11-04'::TIMESTAMP
WHEN lCount < 5000000 THEN '2021-11-05'::TIMESTAMP
WHEN lCount < 6000000 THEN '2021-11-06'::TIMESTAMP
WHEN lCount < 7000000 THEN '2021-11-07'::TIMESTAMP
END)
);
lCount := lCount +1;
END LOOP;
SELECT lCount
INTO poStatus;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
$$;
5. Function 실행해서 700만건 Table에 반영하기
select insert_fn(null);
700만건을 날짜별로 100만건씩 밀어 넣는다.. 시간이 걸린다. 내가 Test하는 환경은 VM 가상머신에 설치된 PostgreSQL이기 때문에 다소 느린다..일단 기다리자.. 다 들어 갈 때 까지......
35초가 걸렸다.. 좀더 대량 데이터를 밀어 넣는다면 소스 중간에 1000 건씩 Commit 하는 구문을 넣어서 사용하시길...난 이 function을 한번 더 실행해서 1400만건을 Partition Table 부어 넣었다.
Data 1400만건, Partition Table
그런데 테이블 이름을 변경하고나서 특이할 만한 사실이 발견되었다. Partition 릴레이션은 변경이 안되고 Table 이름만 변경되었다는 사실..위 쿼리중에 3번(Partition 이 잘 만들어 졌는지 확인 쿼리)을 다시 실행해보자..
Data 3500만건, Partition Table
결론
PostgreSQL 에서 컬럼을 늘리거나 삭제하거나 어떤 행위를 했을 때
Column 형변환이 제일 오래 걸림
나머지 행위는 빠름.
이 글이 누군가에게는 도움이 되길 바라며....
끝~~
'IT' 카테고리의 다른 글
PostgreSQL Partition Table Full scan bug (0) | 2022.02.24 |
---|---|
ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated ORA-01262: Stat failed on a file destination directory (0) | 2022.02.08 |
Oracle plan_hash_value가 0 값을 가지는 이유 (0) | 2021.11.23 |
안드로이드 스튜디오를 이용해서 Web View (웹앱) URL 연동,, 그냥 따라해보기 (0) | 2021.11.12 |
DBMS별 Table / Index 용량 확인하는 쿼리 (0) | 2021.11.11 |