postgresql 무질서 uid 성능 테스트 및 데이터베이스 에 미 친 영향
15038 단어 postgresqluuid성능 테스트
최근 초대형 표 의 성능 테스트 를 하고 있 기 때문에 이 과정 에서 무질서 한 uid 가 메 인 키 로 표 삽입 성능 에 어느 정도 영향 을 미 치 는 것 을 발견 하 였 다.실제 상황 과 결합 하여 표 의 데이터 양 이 많 을 수록 표 삽입 성능 에 미 치 는 영향 도 크다 는 것 을 발견 했다.
테스트 환경
PostgreSQL 은 스 크 립 트 를 삽입 하여 다양한 상황 을 테스트 하 는 tps 를 만 듭 니 다.
데이터베이스 버 전:PostgreSQL 10.4(ArteryBase 5.0.0,Thunisoft)
운영 체제 설정:CentOS Linux 릴 리 스 7,32GB 메모리,8 cpu
테스트 매개 변수:pgbench-M prepared-r-n-j 8-c 8-T 60-f/opt/tunisoft/pgbenchuuid_v4.sql -U sa pgbenchdb
빈 표,1000 w 데이터,5000 w 데이터,1 억 데이터 의 각종 메 인 키 테스트.
무질서 한 uid,질서 있 는 uid,서열 을 테스트 합 니 다.일반 btree 가 있 고 유일한 색인 과 메 인 키 가 없 는 경우 가 있 습 니 다.
테스트
1.테이블 생 성
-- uuid
pgbenchdb=# create table test_uuid_v4(id char(32) primary key);
CREATE TABLE
-- uuid
pgbenchdb=# create table test_time_nextval(id char(32) primary key);
CREATE TABLE
--
pgbenchdb=# create table test_seq_bigint(id int8 primary key);
CREATE TABLE
--
create sequence test_seq start with 1 ;
2.테스트 스 크 립 트
-- uuid
vi pgbench_uuid_v4.sql
insert into test_uuid_v4 (id) values (replace(uuid_generate_v4()::text,'-',''));
-- uuid
vi pgbench_time_nextval.sql
insert into test_time_nextval (id) values (replace(uuid_time_nextval()::text,'-',''));
--
vi pgbench_seq_bigint.sql
insert into test_seq_bigint (id) values (nextval('test_seq'::regclass));
무질서 uid,데이터 없 음
avg-cpu: %user %nice %system %iowait %steal %idle
0.76 0.00 0.38 4.67 0.00 94.19
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 96.00 0.00 2048.00 42.67 1.02 10.67 0.00 10.67 10.33 99.20
dm-0 0.00 0.00 0.00 96.00 0.00 2048.00 42.67 1.02 10.66 0.00 10.66 10.32 99.10
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
tps:
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_uuid_v4.sql -U sa pgbenchdb
transaction type: /opt/thunisoft/pgbench_uuid_v4.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 53494
latency average = 8.974 ms
tps = 891.495404 (including connections establishing)
tps = 891.588967 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
9.006 insert into test_uuid_v4 (id) values (replace(uuid_generate_v4()::text,'-',''));
데이터 없 는 상황 에서 tps
| | | | (tps) |%util |await
---------------+---------+---------+---------+---------+-------+-------
uuid | 919 | 907 | 891 | 906 | 99.2% | 10.66
uuid | 985 | 882 | 932 | 933 | 98.7% | 4.4
| 1311 | 1277 | 1280 | 1289 | 97.5% | 3.4
표 에 100 w 데 이 터 를 초기 화 합 니 다.
pgbenchdb=# insert into test_uuid_v4 (id) select replace(uuid_generate_v4()::text,'-','') from generate_series(1,1000000);
INSERT 0 1000000
Time: 43389.817 ms (00:43.390)
pgbenchdb=# insert into test_time_nextval (id) select replace(uuid_time_nextval()::text,'-','') from generate_series(1,1000000);
INSERT 0 1000000
Time: 30585.134 ms (00:30.585)
pgbenchdb=# insert into test_seq_bigint select generate_series (1,1000000);
INSERT 0 1000000
Time: 9818.639 ms (00:09.819)
uuid 100w 43s, 30s, 10s。
백만 데이터 삽입 후 tps
| | | | (tps) |%util |await
---------------+---------+---------+---------+---------+-------+-------
uuid | 355 | 440 | 302 | 365 | 98.8% | 13
uuid | 948 | 964 | 870 | 927 | 97.2% | 4.0
| 1159 | 1234 | 1115 | 1169 | 96.6% | 3.5
천만 데이터 삽입 후 tps
| | | | (tps) |%util |await
---------------+---------+---------+---------+---------+-------+-------
uuid | 260 | 292 | 227 | 260 | 99.2% | 16.8
uuid | 817 | 960 | 883 | 870 | 97.7% | 3.9
| 1305 | 1261 | 1270 | 1278 | 96.8% | 3.0
5 천만 데이터 삽입 후
5kw ,
pgbenchdb=# insert into test_time_nextval (id) select replace(uuid_time_nextval()::text,'-','') from generate_series(1,50000000);
INSERT 0 50000000
Time: 453985.318 ms (07:33.985)
pgbenchdb=# insert into test_seq_bigint select generate_series (1,50000000);
INSERT 0 50000000
Time: 352206.160 ms (05:52.206)
pgbenchdb=# insert into test_uuid_v4 (id) select replace(uuid_generate_v4()::text,'-','') from generate_series(1,50000000);
INSERT 0 50000000
Time: 1159689.338 ms (00:19:19.689)
, , uuid 7 , 6 , uuid 20 。
pgbenchdb=# alter table test_uuid_v4 add primary key ("id");
ALTER TABLE
Time: 845199.296 ms (14:05.199)
pgbenchdb=# alter table test_time_nextval add primary key ("id");
ALTER TABLE
Time: 932151.103 ms (15:32.151)
pgbenchdb=# alter table test_seq_bigint add primary key ("id");
ALTER TABLE
Time: 148138.871 ms (02:28.139)
pgbenchdb=# select pg_size_pretty(pg_total_relation_size('test_uuid_v4'));
pg_size_pretty
----------------
6072 MB
(1 row)
Time: 0.861 ms
pgbenchdb=# select pg_size_pretty(pg_total_relation_size('test_time_nextval'));
pg_size_pretty
----------------
6072 MB
(1 row)
Time: 0.942 ms
pgbenchdb=# select pg_size_pretty(pg_total_relation_size('test_seq_bigint'));
pg_size_pretty
----------------
2800 MB
(1 row)
Time: 0.699 ms
5kw 삽입 후
| | | | (tps) |%util |await
---------------+---------+---------+---------+---------+-------+-------
uuid | 162 | 163 | 163 | 163 | 99.6% | 18.4
uuid | 738 | 933 | 979 | 883 | 97.7% | 3.9
| 1132 | 1264 | 1265 | 1220 | 96.8% | 3.5
1 억 개의 데 이 터 를 삽입 한 후
| | | | (tps) |%util |await
---------------+---------+---------+---------+---------+-------+-------
uuid | 121 | 131 | 143 | 131 | 99.6% | 28.2
uuid | 819 | 795 | 888 | 834 | 99.2% | 28.7
| 1193 | 1115 | 1109 | 1139 | 96.8% | 11.3
일반 btree 인덱스위 에서 무질서 uid,1kw 의 경우 메 인 키 가 있 는 tps 는 260 이 고 메 인 키 가 없 는 tps 는 1234 입 니 다.일반적인 색인 과 유일한 색인 tps 테스트 를 시도 합 니 다.
--
pgbenchdb=# create index i_test_uuid_v4_id on test_uuid_v4(id);
CREATE INDEX
Time: 316367.010 ms (05:16.367)
--
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_uuid_v4.sql -U sa pgbenchdb
transaction type: /opt/thunisoft/pgbench_uuid_v4.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 13308
latency average = 36.080 ms
tps = 221.727391 (including connections establishing)
tps = 221.749660 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
38.512 insert into test_uuid_v4 (id) values (replace(uuid_generate_v4()::text,'-',''));
--
pgbenchdb=# drop index i_test_uuid_v4_id;
DROP INDEX
Time: 267.451 ms
pgbenchdb=# create unique index i_test_uuid_v4_id on test_uuid_v4(id);
CREATE INDEX
Time: 153372.622 ms (02:33.373)
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_uuid_v4.sql -U sa pgbenchdb
^[[3~transaction type: /opt/thunisoft/pgbench_uuid_v4.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 13847
latency average = 34.693 ms
tps = 230.593988 (including connections establishing)
tps = 230.620469 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
36.410 insert into test_uuid_v4 (id) values (replace(uuid_generate_v4()::text,'-',''));
일반 btree 색인 과 유일한 색인 은 삽입 효율 에 영향 을 줄 수 있 습 니 다.모든 홈 키 인덱스 삭제
--
alter table test_uuid_v4 drop constraint "test_uuid_v4_pkey";
alter table test_time_nextval drop constraint "test_time_nextval_pkey" ;
alter table test_seq_bigint drop constraint "test_seq_bigint_pkey";
1,-- uuid: pgbench_uuid_v4.sql
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_uuid_v4.sql -U sa pgbenchdb
transaction type: /opt/thunisoft/pgbench_uuid_v4.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 74109
latency average = 6.479 ms
tps = 1234.842229 (including connections establishing)
tps = 1235.042674 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
6.112 insert into test_uuid_v4 (id) values (replace(uuid_generate_v4()::text,'-',''));
2、-- uuid, pgbench_time_nextval.sql
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_time_nextval.sql -U sa pgbenchdb
transaction type: /opt/thunisoft/pgbench_time_nextval.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 74027
latency average = 6.486 ms
tps = 1233.364360 (including connections establishing)
tps = 1233.482292 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
6.186 insert into test_time_nextval (id) values (replace(uuid_time_nextval()::text,'-',''));
3、-- , pgbench_seq_bigint.sql
[thunisoft@localhost thunisoft]$ pgbench -M prepared -r -n -j 8 -c 8 -T 60 -f /opt/thunisoft/pgbench_seq_bigint.sql -U sa pgbenchdb
transaction type: /opt/thunisoft/pgbench_seq_bigint.sql
scaling factor: 1
query mode: prepared
number of clients: 8
number of threads: 8
duration: 60 s
number of transactions actually processed: 76312
latency average = 6.290 ms
tps = 1271.832907 (including connections establishing)
tps = 1272.124397 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
5.916 insert into test_seq_bigint (id) values (nextval('test_seq'::regclass));
홈 키 제약 을 삭제 한 후 세 가지 상황 에서 tps 는 매우 가 까 워 모두 1200+에 달 했다.Btree 색인,삽입 작업 의 평균 tps 대비
/ tps | | | | |
---------------+---------+---------+---------+---------+
uuid | 960 | 260 | 163 | 131 |
uuid | 933 | 870 | 883 | 834 |
| 1289 | 1278 | 1220 | 1139 |
테스트 데이터 에 따 르 면 무질서 한 uid 는 데이터 가 1kw 에 도착 한 후에 데 이 터 를 삽입 하 는 tps 가 매우 떨 어 졌 고 질서 있 는 uid 와 증가 서열 이 비교적 적 게 떨 어 졌 다.1 억 데이터 의 tps 질서 있 는 uid 는 무질서 한 6 배 이 고 서열 은 무질서 한 uid 의 9 배 입 니 다.색인 정 보 를 저장 하기 위해 서 별도의 표 공간 을 만 듭 니 다.
얼마나 빠 른 디스크 가 있 으 면 색인 과 데 이 터 를 분리 해서 저장 해서 쓰기 속 도 를 높 일 수 있다.
단독 색인 공간 만 들 기:
create tablespace indx_test owner sa location '/home/tablespace/index_test';
지정 한 색인 저장 디 렉 터 리:
create index i_test_uuid_v4_id on test_uuid_v4 using btree(id) tablespace indx_test;
질서 있 는 uid 에 대하 여
사용 하 는 sequential-uids 플러그 인 을 테스트 하여 질서 있 는 uid 를 생 성 합 니 다.
질서 있 는 uid 의 구 조 는(block ID;random data)는 실제 적 으로 데 이 터 를 두 부분 으로 나 누고 일 부 는 증가 하 며 일 부 는 랜 덤 입 니 다.
sequential-uuids
sequential-uuids-git
두 가지 알고리즘 을 제공 합 니 다.
1.uuid_sequence_nextval(sequence regclass, block_size int default 65536, block_count int default 65536)
접 두 사 는 자체 증가 시퀀스 입 니 다.블록 ID 가 2 바이트 로 저장 되면 하나의 색인 BLOCK 에 256 개의 기록(8K 의 BLOCK 를 가정 하면 하나의 기록 은 uid VALUE(16 바이트)와 ctid(6 바이트)를 포함 하기 때문에 하나의 색인 페이지 에 약 363 개의 기록(8000/(16+6)이 저 장 됩 니 다.)
2.uuid_time_nextval(interval_length int default 60, interval_count int default 65536) RETURNS uuid
기본 60 초 간 데이터 의 접 두 사 는 같 습 니 다.접 두 사 는 1 증가 하고 65535 후 순환 합 니 다.
uuid_time_nextval uuid
pgbenchdb=# select id from test_time_nextval;
id
----------------------------------
a18b7dd0ca92b0b5c1844a402f9c6999
a18b540b8bbe0ddb2b6d0189b2e393c6
a18b83eb7320b0a90e625185421e065e
a18bade4ff15e05dab81ecd3f4c2dee4
a18b79e41c3bc8d2d4ba4b70447e6b29
a18bdad18d9e0d2fa1d9d675bc7129f0
a18b13723ec7be9a2f1a3aec5345a88b
a18bd9d866047aec69a064d30e9493d2
a18bd76e8c787c7464479502f381e6d7
a18ba5c0c966f81cfdbeff866618da8d
......
질서 있 는 uid 앞 네 자리 질서 있 고 뒤의 무 작위 생 성.결어
1.질서 있 는 uid 에 대해 4 위 는 질서 가 있 고 뒤 에는 무 작위 로 생 성 됩 니 다.
2.이 환경 에서 무질서 한 uid 는 데이터 양 이 계속 증가 함 에 따라 tps 의 하락 이 비교적 심 하 다 는 것 을 발견 했다.
3.btree 색인 이 존재 하기 때문에 무질서 한 uid 는 대량의 이산 io 를 초래 할 수 있 습 니 다.디스크 사용률 이 높다.삽입 효율 에 도 영향 을 미친다.표 데이터 의 양 이 증가 함 에 따라 더욱 뚜렷 해 졌 다.
4.이 테스트 는 일반 디스크 에서 테스트 하 는 것 으로 ssd 에서 테스트 하지 않 습 니 다.
5.질서 있 는 uid 를 사용 하려 면 여러 가지 실현 방식 이 있 고 분포 식 상황 에서 전체적인 질서 있 는 uid 를 생 성 하 는 것 도 고려 해 야 합 니 다.
이상 은 postgresql 무질서 uid 성능 테스트 의 상세 한 내용 입 니 다.postgresql 무질서 uid 성능 테스트 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
postgresql의 jsonb 데이터 조회 및 수정 방법jsonb PostgreSQL 문서에서 정의한 데이터 형식 json과 jsonb는 거의 같다.관건적인 차이점은 json 데이터는 JSON 입력 텍스트의 정확한 복사본으로 저장되고 jsonb는 분해된 2진 형식으로 데...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.