며칠 전인 9월 24일에 PostgreSQL 13 정식 버전이 릴리즈 되었다.

이번 기회에 개인적으로 공부도 할겸, 공식 문서와 해외 여러 곳에서 다룬 이번 PG13에 대한 글들을 한글로 정리하고자 한다.

참조한 곳들은 이 글들의 가장 아래에 언급해 두었다. 내용이 이해가 가지 않거나, 불명확한 부분이 있다면 그곳을 참고하기 바란다.

PG 13 버전에서 성능과 관련하여 변경된 점들 중, 가장 관심이 가는 부분들은 중복 데이터 관련하여 B-TREE 인덱스 사이즈가 줄어든 것,인덱스에 대한 VACUUM 작업과 REINDEX 작업이 병렬 처리 지원이 된다는 점들이다. 그 외에도 파티션 관련 성능 개선이나 사용되었던 복제 슬롯으로 인한 WAL 파일 늘어남으로 인한 DISK 용량 관리 문제 등이 해결되었다.

이 중 제일 먼저 다룰 부분은 중복 데이터 존재시의 B-TREE 인덱스 크기 변화이며, PG 11, 12 그리고 13 버전에서의 용량 그리고 성능 차이를 다뤄 보겠다.

B-Tree Index 크기 변화

PostgreSQL 12 버전 릴리즈 때에도 multi-column에 생성한 인덱스 관련하여 중복값 관련 인덱스 용량이 30%가량 줄어들었던 것으로 기억하는데, PG 13에서는 어떤 변화가 있는지에 대해 알아보도록 하자.

인덱스 생성에 사용한 구문(300만건)

# CREATE TABLE rel (
#    aid bigint NOT NULL,
#    bid bigint NOT NULL
# );
CREATE TABLE
# ALTER TABLE rel
#    ADD CONSTRAINT rel_pkey PRIMARY KEY (aid, bid);
ALTER TABLE
# CREATE INDEX rel_bid_idx ON rel (bid);
CREATE INDEX
#  INSERT INTO rel (aid, bid)
#     SELECT i, i / 10000
#     FROM generate_series(1, 3000000) AS i;

위의 방식으로 생성한 데이터는 aid의 경우는 1부터 300만까지가 중복없이 존재하고 bid의 경우는 0부터 299까지의 중복되는 값이 대략 10000건씩 존재하게 된다. 이제 각 버전에서 각 인덱스들이 차지하는 용량을 비교해보도록 하자.

버전별로 생성된 인덱스들이 차지하는 디스크 용량

*PostgreSQL 11 *

# select version();
                                                 version
------------------------------------------------------------------------------------------
 PostgreSQL 11.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8
(1 row)

# \di+
                            List of relations
  Schema  |    Name     | Type  |  Owner   | Table |  Size  | Description
----------+-------------+-------+----------+-------+--------+-------------
 public | rel_bid_idx | index | postgres | rel   | 281 MB |
 public | rel_pkey    | index | postgres | rel   | 299 MB |
(2 rows)

PostgreSQL 12

# select version();
                                                 version

------------------------------------------------------------------------------------------
---------------
 PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8
.5-39), 64-bit
(1 row)

# \di+
                           List of relations
 Schema  |    Name     | Type  |  Owner  | Table |  Size  | Description
---------+-------------+-------+---------+-------+--------+-------------
 public | rel_bid_idx | index | postgres | rel   | 152 MB |
 public | rel_pkey    | index | postgres | rel   | 134 MB |
(2 rows)

PostgreSQL 13

# select version();
                                                 version
------------------------------------------------------------------------------------------
 PostgreSQL 13.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8
(1 row)

# \di+
                                  List of relations
 Schema  |    Name     | Type  |  Owner  | Table | Persistence |  Size  | Description
---------+-------------+-------+---------+-------+-------------+--------+-------------
 public | rel_bid_idx | index | postgres | rel   | permanent   | 56 MB  |
 public | rel_pkey    | index | postgres | rel   | permanent   | 179 MB |
(2 rows)
  • 중복값 관련 인덱스 용량 변화량
PG version rel_bid_idx rel_pkey
11.7 281 MB 299 MB
12.3 152 MB(54%) 134 MB(44%)
13.0 56 MB(20%) 179 MB(59%)

용량의 변화가 인덱스를 사용한 쿼리 플랜에 어떤 영향을 미치는지 확인해보기 위해, 하단의 간단한 쿼리를 수행시켜, 수행시간을 비교해보았다.

select min(bid) from rel where aid between 10000 and 150000;

PostgreSQL 11

                                QUERY PLAN
---------------------------------------------------------------------------
 Result (actual rows=1 loops=1)
   Buffers: shared hit=174
   InitPlan 1 (returns $0)
     ->  Limit (actual rows=1 loops=1)
           Buffers: shared hit=174
           ->  Index Scan using rel_bid_idx on rel (actual rows=1 loops=1)
                 Index Cond: (bid IS NOT NULL)
                 Filter: ((aid >= 10000) AND (aid <= 150000))
                 Rows Removed by Filter: 9999
                 Buffers: shared hit=174

PostgreSQL 12

                                QUERY PLAN
---------------------------------------------------------------------------
 Result (actual rows=1 loops=1)
   Buffers: shared hit=85
   InitPlan 1 (returns $0)
     ->  Limit (actual rows=1 loops=1)
           Buffers: shared hit=85
           ->  Index Scan using rel_bid_idx on rel (actual rows=1 loops=1)
                 Index Cond: (bid IS NOT NULL)
                 Filter: ((aid >= 10000) AND (aid <= 150000))
                 Rows Removed by Filter: 9999
                 Buffers: shared hit=85

PostgreSQL 13

                                QUERY PLAN
---------------------------------------------------------------------------
 Result (actual rows=1 loops=1)
   Buffers: shared hit=67
   InitPlan 1 (returns $0)
     ->  Limit (actual rows=1 loops=1)
           Buffers: shared hit=67
           ->  Index Scan using rel_bid_idx on rel (actual rows=1 loops=1)
                 Index Cond: (bid IS NOT NULL)
                 Filter: ((aid >= 10000) AND (aid <= 150000))
                 Rows Removed by Filter: 9999
                 Buffers: shared hit=67
 Planning:
   Buffers: shared hit=8

실제로 인덱스 블록의 READ 수가 줄어들었음을 확인할 수 있으며, 이는 결국 성능 개선으로 연결될 것이다. 테이블의 사이즈가 더 커지고, 사용하는 인덱스가 많아질 수록, 이러한 변화는 DB 레벨로 보았을 때 결코 적지 않은 차이로 이어질 것이다.

한가지 염두에 두어야 할 점이 있다면, PostgreSQL 12버전 릴리즈 때도 마찬가지였지만 기존 버전을 PG_UPGRADE를 이용하여 버전을 변경한 경우, 인덱스 용량 개선과 그로 인한 성능 개선의 혜택을 보고 싶다면, REINDEX 작업이 필요하다. pg_dump&restore 방식으로 작업한다면 이러한 문제는 없겠지만, 별도의 용량과 시간이 필요한 것은 마찬가지이므로, PostgreSQL 운영 환경의 메이저 버전 업그레이드를 생각하고 있다면, PG_UPGRADE 후에 REINDEX 작업이 필요하다는 점을 염두에 두도록 하자.

 

관련되어 PG13부터 추가된 공식 문서에는 어떤 방식으로 중복값 제거가 도입되었고, 어떤 경우에 중복값 제거의 사용이 안되는지에 대해서 언급하고 있다.

https://www.postgresql.org/docs/13/btree-implementation.html

'PostgreSQL' 카테고리의 다른 글

bloat postgresql check query  (0) 2021.07.18
PostgreSQL에 oracle_fdw 설정하기- 2/2  (0) 2021.01.20
PostgreSQL에 oracle_fdw 설정하기- 1/2  (0) 2021.01.20
PostgreSQL Toast에 관한 정리  (0) 2020.09.26

해당 글은 PG 11 기준으로 작성되었습니다.

Toast(The Oversized-Attribute Storage Technique)

정의: Toast는 크기가 고정되지 않는 타입의 Column 에 적용되는 기술로, 보다 큰 column 사이즈를 지원하기 위해 값을 압축/분할하여 별도의 pg_toast에 각각의 row로 담아 관리하는 기술이다.

fixed page size (commonly 8 kB) 보다 큰 경우에 적용된다.

- toast 관련하여 4가지 모드가 있으며, 모드들은 압축 유/무 분할 유/무 에 관련된 내용들이 있다.

- PostgreSQL 11버전 기준으로 toast 관련된 table space를 별도로 지정하는 기능은 없다.
(오라클에는 lob column을 별도의 테이블 스페이스로 지정 가능한 것과 대비된다.)

- 테이블 스페이스 사용하고 text 데이터를 생성하여 toast 테이블 사용하였을 시에 해당 테이블 스페이스에 공간이 늘어나는 것을 확인하였다.

toast table 사용되게 생성 및 확인 관련 쿼리

promdb=# CREATE table t1_toast(message text);
 ##### 테이블 toast 생성#####

 promdb=# INSERT INTO t1_toast
 SELECT (SELECT
    string_agg(chr(floor(random() * 26)::int + 65), '')
     FROM generate_series(1,10000))
 FROM generate_series(1,10);
 ##### 테이블 toast에 row 생성#####

 promdb=# SELECT reltoastrelid::regclass
    FROM pg_class
WHERE relname = 't1_toast';
   reltoastrelid
 -------------------------
 pg_toast.pg_toast_41120
 ##### 테이블 toast의 message row을 압축/분할해서 담고 있는 테이블 명 조회 #####

 promdb-#  SELECT pg pg_toast.pg_toast_41120;
 ##### 압축/분할되어 있는 테이블 내용확인 #####

 

특정 column toast 모드 변경하기(alter table set storage)

alter table t1_toast alter column column_name set storage EXTENDED;

 

량순으로 table 정렬해서 top 20개 보기

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC
  LIMIT 20;

 

해당하는 테이블에 연결된 toast 테이블 이름 찾기

select relname from pg_class where oid = (select  reltoastrelid from pg_class where relname='<t1_toast>');

 

 

'PostgreSQL' 카테고리의 다른 글

bloat postgresql check query  (0) 2021.07.18
PostgreSQL에 oracle_fdw 설정하기- 2/2  (0) 2021.01.20
PostgreSQL에 oracle_fdw 설정하기- 1/2  (0) 2021.01.20
PostgreSQL 13(1편 Index size)  (0) 2020.09.27

필요한지는 모르겠지만, 갖고싶어서 샀다.

구입 주요 이유들

장점

400 nit 저전력 화면: 100% SRBG 색재현율, 충분한 밝기

1.27kg의 가벼운 무게

USB-C 포트 2개: 두 포트 모두 USB-PD 충전, ALT-DISPLAY 지원

USB-A 포트 2개(USB 3.0)

HDMI 단자 1개

씽크패드 키보드: 백라이트 및 좋은 키감

CPU AMD 4750U: 벤치마크상 인텔 10세대의 2배에 가까운 성능

NVME SSD 2개 장착 및 부팅 가능(추후 리뷰에서 다룸)

상판과 하판 재질: 상판은 카본, 하판은 마그네슘으로 SSD 쿨링패드를 이용한 쿨링 가능

단점

확장이 되지 않는 온보드 램(16GB)

레노버의 악명높은 A/S

RJ45 LAN 포트 없음.(T14는 있음)

작업 내역

하판 분해 후 SSD 교체 작업(삼성 256GB -> SN750 1TB)

CPU 팬 분해 후 써멀 재도포

비어있는 WWAN 포트에 SN520 256GB 장착하여 백업 용도로 사용

'IT 관련' 카테고리의 다른 글

씽크센터 m75q tiny 구입  (0) 2022.02.21
T14S 구입 후 사용기  (0) 2020.09.28
샤오미 스마트 선풍기  (0) 2018.05.02
AMD의 레이븐릿지 CPU 비교글  (0) 2018.04.10

여름대비용으로 dc모터가 들어간 선풍기를 사고 싶어 찾아보니 6만원대부터 비싼 제품은 30만원대까지 다양했다.

그 중에 오래가고 내 환경에 쓸만한 제품을 찾다보니

자연스럽게 마지막에 남게된 샤오미 선풍기. 구입가는 10만원 정도.(구입처는 글 마지막에)


탈착형 배터리가 있어 들고다니며 쓸수있고 dc모터의 낮은 소비전력/소음과 굉장히 심플한 디자인을 가지고 있다.

샤오미 기기라 이미 집에 설치된 게이트웨이를 통해 각종 센서들과 연동이 가능한 점이 제품을 선택하게 된 이유이다.



이런 무선 버튼이 샤오미 게이트웨이를 통해 앱에 등록되어있고


이런 식으로 자동화 프로파일을 만들어서 사용가능하다. 이 버튼은 한번클릭/두번클릭/길게클릭 이렇게 각각 다른 기능으로 지정가능. 별도의 온도 센서를 통해 제어도 가능하다.

약간 찝찝한 점이라면 역시 AS문제인데.. 구입처에서 어떻게든 해주겠지. 설마 망가지겠어 하는 해이한 마음으로 구입해버렸다.

장점들

소비전력이 적고 저단에서 소음이 적다.


와이파이를 통한 샤오미앱으로 제어가능하고 샤오미 게이트웨이가 구성되어 있는 집에서는 온도/습도 센서나 스마트버튼, 스마트큐브 등으로 자동화 내지는 원격 제어 가능. 


탈착형 배터리 장착으로 인해 이동성이 좋다.(배터리로 최대 10시간 가량 작동가능하다)


단점들

기본으로 주는 리모컨이 없어 스마트폰 앱으로 제어해야 한다.(내지는 게이트웨이 구성을 해야해서 추가비용이 듬)

코드연결 안하고 배터리로 작동하다 꺼놓으면 일정 시간이 지난 후에 오프라인 모드로 들어가 앱상에서 제어 불가능(전원버튼을 눌러줘야한다).

8자코드를 사용하는지라 배터리를 사용했음에도 전선 탈부착이 귀찮다.(단자접점식이면 좋았을 듯하다.)

필자는 이곳에서 구매하였다. 누구나 가능한 기본쿠폰 발급+페이코 3% 할인받음.(2018년 5월기준 10만 5천원 정도)


'IT 관련' 카테고리의 다른 글

T14S 구입 후 사용기  (0) 2020.09.28
Thinkpad T14s AMD 구입기  (0) 2020.09.26
AMD의 레이븐릿지 CPU 비교글  (0) 2018.04.10
라즈베리 파이 3B+ 출시  (0) 2018.03.14

2018년에 출시된 AMD의 신작 APU(CPU+GPU)


상당한 성능의 cpu와 내장 gpu 성능으로 보안 문제로 성능이 저하되고 제품 이미지도 저하된


인텔이 주춤하는 사이라 더욱 부각되는 AMD의 신제품.



CPU 벤치마크 종류의 하나인 passMark 점수와 가격대비 성능차이 등을 고려해서 비교해보았다.


 라이젠(ryzen) 3 2200G

라이젠(ryzen) 5 2400G 

 차이

 PASSMARK 평균점수

(싱글코어)

1838

1940 

95%

  PASSMARK 평균점수

(멀티코어)

7423

9430 

79%

 TDP(설계전력)

 65 W

65 W

100% 

국내 가격(포스팅기준)

 105,000 원

167,000 원 

63% 

 해외 가격

$104 USD

$162 USD

64%


오버워치의 경우 2200g는 최저옵으로 56프레임, 2400g는 중간 옵션으로 49프레임으로 구동가능하다고..


외장 그래픽카드로 치면 지포스 1030 정도라고 생각하면 될 꺼같다.


메인보드는 m-atx 사이즈의 경우 8~9만원 정도, m-itx 사이즈는 12만원부터.


라이젠 릿지를 지원하는 메인보드의 경우 라이젠을 장착시 HDMI 2.0을 지원한다(60Hz). DP의 경우도 마찬가지.


플루이드 모션을 지원하기 때문에 동영상 감상 용으로 굉장히 훌륭한 선택이 될 수 있을듯.


케이스,파워 등을 잘 고려하면 아마 40만원 전후로 라이젠 2200G가 들어간 PC를 구입할수 있을듯.


내장 그래픽을 쓰는 시스템의 경우 메모리를 듀얼채널로 구성해 주는것이 성능에 상당한 영향을 미친다.


APU의 특성상 CPU와 GPU를 동시에 사용하는 작업을 할 경우에 발열이 한 곳에서


집중되는 경향이 있기 때문에 베어본 PC가 나오기까지는 시간이 좀 걸릴듯하다.




제로백이 3초라는 현대에서 선보인 컨셉트 전기차.


전기차이고 탄소섬유로 제작된 윙도어 방식의 쿠페이다.


2018 뉴욕 국제 자동차 박람회에서 선보였다.


미디어의 반응을 보니 제네시스라는 브랜드 자체가 북미 내에서도 아직은


한국에서처럼 알려지진 않은 게 현실인 듯 하다.


현대가 전기차를 더 많이 출시해주었으면 하는 기대를 해본다.


더 많은 자료는 현대 제네시스 홈페이지에서 확인할 수 있다.


+ Recent posts