├── .gitignore ├── pg_oltp_bench.control ├── pg_oltp_bench--1.0.sql ├── Makefile ├── oltp_init.sql ├── pg_oltp_bench.c ├── oltp_ro.sql └── oltp_rw.sql /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated subdirectories 2 | /log/ 3 | /results/ 4 | /tmp_check/ 5 | *.o 6 | *.so -------------------------------------------------------------------------------- /pg_oltp_bench.control: -------------------------------------------------------------------------------- 1 | # pg_oltp_bench extension 2 | comment = 'supporting function for oltp benchmark' 3 | default_version = '1.0' 4 | module_pathname = '$libdir/pg_oltp_bench' 5 | relocatable = true 6 | -------------------------------------------------------------------------------- /pg_oltp_bench--1.0.sql: -------------------------------------------------------------------------------- 1 | /* contrib/pg_oltp_bench/pg_oltp_bench--1.0.sql */ 2 | 3 | -- complain if script is sourced in psql, rather than via CREATE EXTENSION 4 | \echo Use "CREATE EXTENSION pg_oltp_bench" to load this file. \quit 5 | 6 | CREATE FUNCTION sb_rand_str(text) 7 | RETURNS text 8 | AS 'MODULE_PATHNAME' 9 | LANGUAGE C VOLATILE STRICT; 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # contrib/pg_oltp_bench/Makefile 2 | 3 | MODULES = pg_oltp_bench 4 | 5 | EXTENSION = pg_oltp_bench 6 | DATA = pg_oltp_bench--1.0.sql 7 | PGFILEDESC = "pg_oltp_bench - supporting function for oltp benchmark" 8 | 9 | REGRESS = pg_oltp_bench 10 | 11 | ifdef USE_PGXS 12 | PG_CONFIG = pg_config 13 | PGXS := $(shell $(PG_CONFIG) --pgxs) 14 | include $(PGXS) 15 | else 16 | subdir = contrib/pg_oltp_bench 17 | top_builddir = ../.. 18 | include $(top_builddir)/src/Makefile.global 19 | include $(top_srcdir)/contrib/contrib-global.mk 20 | endif 21 | -------------------------------------------------------------------------------- /oltp_init.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS sbtest; 2 | 3 | CREATE TABLE sbtest( 4 | id SERIAL PRIMARY KEY, 5 | k INTEGER DEFAULT '0' NOT NULL, 6 | c CHAR(120) DEFAULT '' NOT NULL, 7 | pad CHAR(60) DEFAULT '' NOT NULL); 8 | 9 | INSERT INTO sbtest (k, c, pad) 10 | SELECT 11 | (random() * 10000000)::int + 1 AS k, 12 | sb_rand_str('###########-###########-###########-###########-###########-###########-###########-###########-###########-###########') AS c, 13 | sb_rand_str('###########-###########-###########-###########-###########') AS pad 14 | FROM 15 | generate_series(1, 10000000) j; 16 | 17 | CREATE INDEX sbtest_k_idx ON sbtest(k); 18 | -------------------------------------------------------------------------------- /pg_oltp_bench.c: -------------------------------------------------------------------------------- 1 | /* 2 | * contrib/pg_oltp_bench/pg_oltp_bench.c 3 | */ 4 | #include "postgres.h" 5 | 6 | #include "fmgr.h" 7 | #include "mb/pg_wchar.h" 8 | #include "utils/datum.h" 9 | 10 | PG_MODULE_MAGIC; 11 | PG_FUNCTION_INFO_V1(sb_rand_str); 12 | 13 | Datum 14 | sb_rand_str(PG_FUNCTION_ARGS) 15 | { 16 | text *result; 17 | char *p, 18 | *end; 19 | 20 | result = (text *) DatumGetPointer(datumCopy(PG_GETARG_DATUM(0), false, -1)); 21 | 22 | p = VARDATA_ANY(result); 23 | end = p + VARSIZE_ANY_EXHDR(result); 24 | 25 | while (p < end) 26 | { 27 | int len = pg_mblen(p); 28 | 29 | if (len == 1) 30 | { 31 | if (*p == '#') 32 | *p = (random() % ('9' - '0' + 1)) + '0'; 33 | else if (*p == '@') 34 | *p = (random() % ('z' - 'a' + 1)) + 'a'; 35 | } 36 | p += len; 37 | } 38 | 39 | PG_RETURN_POINTER(result); 40 | } 41 | -------------------------------------------------------------------------------- /oltp_ro.sql: -------------------------------------------------------------------------------- 1 | \set table_size 10000000 2 | \set range_size 100 3 | \set id1 random(1, :table_size) 4 | \set id2 random(1, :table_size) 5 | \set id3 random(1, :table_size) 6 | \set id4 random(1, :table_size) 7 | \set id5 random(1, :table_size) 8 | \set id6 random(1, :table_size) 9 | \set id7 random(1, :table_size) 10 | \set id8 random(1, :table_size) 11 | \set id9 random(1, :table_size) 12 | \set id10 random(1, :table_size) 13 | \set r1l random(1, :table_size) 14 | \set r1u :r1l + :range_size 15 | \set r2l random(1, :table_size) 16 | \set r2u :r2l + :range_size 17 | \set r3l random(1, :table_size) 18 | \set r3u :r3l + :range_size 19 | \set r4l random(1, :table_size) 20 | \set r4u :r4l + :range_size 21 | SELECT c FROM sbtest WHERE id = :id1; 22 | SELECT c FROM sbtest WHERE id = :id2; 23 | SELECT c FROM sbtest WHERE id = :id3; 24 | SELECT c FROM sbtest WHERE id = :id4; 25 | SELECT c FROM sbtest WHERE id = :id5; 26 | SELECT c FROM sbtest WHERE id = :id6; 27 | SELECT c FROM sbtest WHERE id = :id7; 28 | SELECT c FROM sbtest WHERE id = :id8; 29 | SELECT c FROM sbtest WHERE id = :id9; 30 | SELECT c FROM sbtest WHERE id = :id10; 31 | SELECT c FROM sbtest WHERE id BETWEEN :r1l AND :r1u; 32 | SELECT SUM(K) FROM sbtest WHERE id BETWEEN :r2l AND :r2u; 33 | SELECT c FROM sbtest WHERE id BETWEEN :r3l AND :r3u ORDER BY c; 34 | SELECT DISTINCT c FROM sbtest WHERE id BETWEEN :r4l AND :r4u; 35 | -------------------------------------------------------------------------------- /oltp_rw.sql: -------------------------------------------------------------------------------- 1 | \set table_size 10000000 2 | \set range_size 100 3 | \set id1 random(1, :table_size) 4 | \set id2 random(1, :table_size) 5 | \set id3 random(1, :table_size) 6 | \set id4 random(1, :table_size) 7 | \set id5 random(1, :table_size) 8 | \set id6 random(1, :table_size) 9 | \set id7 random(1, :table_size) 10 | \set id8 random(1, :table_size) 11 | \set id9 random(1, :table_size) 12 | \set id10 random(1, :table_size) 13 | \set r1l random(1, :table_size) 14 | \set r1u :r1l + :range_size 15 | \set r2l random(1, :table_size) 16 | \set r2u :r2l + :range_size 17 | \set r3l random(1, :table_size) 18 | \set r3u :r3l + :range_size 19 | \set r4l random(1, :table_size) 20 | \set r4u :r4l + :range_size 21 | \set u1 random(1, :table_size) 22 | \set u2 random(1, :table_size) 23 | \set u3 random(1, :table_size) 24 | \set u4 random(1, :table_size) 25 | BEGIN; 26 | SELECT c FROM sbtest WHERE id = :id1; 27 | SELECT c FROM sbtest WHERE id = :id2; 28 | SELECT c FROM sbtest WHERE id = :id3; 29 | SELECT c FROM sbtest WHERE id = :id4; 30 | SELECT c FROM sbtest WHERE id = :id5; 31 | SELECT c FROM sbtest WHERE id = :id6; 32 | SELECT c FROM sbtest WHERE id = :id7; 33 | SELECT c FROM sbtest WHERE id = :id8; 34 | SELECT c FROM sbtest WHERE id = :id9; 35 | SELECT c FROM sbtest WHERE id = :id10; 36 | SELECT c FROM sbtest WHERE id BETWEEN :r1l AND :r1u; 37 | SELECT SUM(K) FROM sbtest WHERE id BETWEEN :r2l AND :r2u; 38 | SELECT c FROM sbtest WHERE id BETWEEN :r3l AND :r3u ORDER BY c; 39 | SELECT DISTINCT c FROM sbtest WHERE id BETWEEN :r4l AND :r4u; 40 | UPDATE sbtest SET k = k + 1 WHERE id = :u1; 41 | UPDATE sbtest SET c = sb_rand_str('###########-###########-###########-###########-###########-###########-###########-###########-###########-###########') WHERE id = :u2; 42 | DELETE FROM sbtest WHERE id = :u3; 43 | INSERT INTO sbtest (id, k, c, pad) VALUES (:u3, :u4, sb_rand_str('###########-###########-###########-###########-###########-###########-###########-###########-###########-###########'), sb_rand_str('###########-###########-###########-###########-###########')) ON CONFLICT DO NOTHING; 44 | COMMIT; --------------------------------------------------------------------------------