Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support pgsql prepare and execute #40

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
83 changes: 83 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,63 @@
TPCC-like workload for sysbench 1.0.x.
**Make sure you are using sysbench 1.0.14 or better!**

# modified by digoal
1\. Use prepared statement for postgresql.

2\. Use Read committed by default

3\. modified file: ```tpcc_common.lua, tpcc.lua, tpcc_run.lua```

# PostgreSQL example (use modified prepared statement by digoal)
for exp.

```
unixsocket_dir='/tmp'
port=1921
user=postgres
dbname=postgres
```

## PostgreSQL: prepare data and tables
```
./tpcc.lua --pgsql-host=/tmp --pgsql-port=1921 --pgsql-user=postgres --pgsql-db=postgres --threads=64 --tables=10 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql prepare
```

or disable foreign key

```
./tpcc.lua --pgsql-host=/tmp --pgsql-port=1921 --pgsql-user=postgres --pgsql-db=postgres --threads=64 --tables=10 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql --use_fk=0 prepare
```

or use custom tablespace

```
export pgsql_table_options="tablespace tbs1"
export pgsql_index_options="tablespace tbs2"

./tpcc.lua --pgsql-host=/tmp --pgsql-port=1921 --pgsql-user=postgres --pgsql-db=postgres --threads=64 --tables=10 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql --use_fk=0 prepare
```

or use zheap custom storage_engine

```
export pgsql_table_options="with (storage_engine='zheap') tablespace tbs1"
export pgsql_index_options="tablespace tbs2"

./tpcc.lua --pgsql-host=/tmp --pgsql-port=4001 --pgsql-user=postgres --pgsql-db=postgres --threads=64 --tables=20 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql --use_fk=0 prepare
```

## PostgreSQL: Run benchmark
```
./tpcc.lua --pgsql-host=/tmp --pgsql-port=1921 --pgsql-user=postgres --pgsql-db=postgres --time=300 --threads=64 --report-interval=1 --tables=10 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql --use_fk=0 --enable_purge=yes run
```

## PostgreSQL: Cleanup
```
./tpcc.lua --pgsql-host=/tmp --pgsql-port=1921 --pgsql-user=postgres --pgsql-db=postgres --time=300 --threads=64 --report-interval=1 --tables=10 --scale=100 --trx_level=RC --db-ps-mode=auto --db-driver=pgsql --use_fk=0 cleanup
```

# for MySQL
# prepare data and tables

`
Expand All @@ -26,3 +83,29 @@ TPCC-like workload for sysbench 1.0.x.
`
./tpcc.lua --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-db=sbt --time=300 --threads=64 --report-interval=1 --tables=10 --scale=100 --db-driver=mysql cleanup
`

# options
```
-- Command line options
sysbench.cmdline.options = {
scale =
{"Scale factor (warehouses)", 100},
tables =
{"Number of tables", 1},
use_fk =
{"Use foreign keys", 1},
force_pk =
{"Force using auto-inc PK on history table", 0},
trx_level =
{"Transaction isolation level (RC, RR or SER)", "RC"},
enable_purge =
{"Use purge transaction (yes, no)", "no"},
report_csv =
{"Report output in csv (yes, no)", "no"},
mysql_storage_engine =
{"Storage engine, if MySQL is used", "innodb"},
mysql_table_options =
{"Extra table options, if MySQL is used. e.g. 'COLLATE latin1_bin'", ""}
}
```

285 changes: 285 additions & 0 deletions result_pg_11_tpcc.txt

Large diffs are not rendered by default.

271 changes: 268 additions & 3 deletions tpcc.lua
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,272 @@ function thread_init()
if drv:name() == "mysql" then
con:query("SET autocommit=0")
end



-- prepare statement for postgresql

if drv:name() == "pgsql" then
for table_num = 1, sysbench.opt.tables
do

con:query(([[prepare p_new_order1_%d(int2,int2,int4) as SELECT c_discount, c_last, c_credit, w_tax
FROM customer%d, warehouse%d
WHERE w_id = $1
AND c_w_id = w_id
AND c_d_id = $2
AND c_id = $3]]):
format(table_num, table_num, table_num))

con:query(([[prepare p_new_order2_%d(int2,int2) as SELECT d_next_o_id, d_tax
FROM district%d
WHERE d_w_id = $1
AND d_id = $2 FOR UPDATE]]):
format(table_num, table_num))


con:query(([[prepare p_new_order3_%d(int4,int2,int2) as UPDATE district%d
SET d_next_o_id = $1
WHERE d_id = $2 AND d_w_id= $3]]):format(table_num, table_num))

con:query(([[prepare p_new_order4_%d(int4,int2,int2,int4,int2,int2) as INSERT INTO orders%d
(o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_ol_cnt, o_all_local)
VALUES ($1,$2,$3,$4,NOW(),$5,$6)]]):
format(table_num, table_num))

con:query(([[prepare p_new_order5_%d(int4,int2,int2) as INSERT INTO new_orders%d (no_o_id, no_d_id, no_w_id)
VALUES ($1,$2,$3)]]):
format(table_num, table_num))

con:query(([[prepare p_new_order6_%d(int4) as SELECT i_price, i_name, i_data
FROM item%d
WHERE i_id = $1]]):
format(table_num, table_num))

for d_id = 1, DIST_PER_WARE
do
con:query(([[prepare p_new_order7_%d_%s(int4,int2) as SELECT s_quantity, s_data, s_dist_%s s_dist
FROM stock%d
WHERE s_i_id = $1 AND s_w_id= $2 FOR UPDATE]]):
format(table_num, string.format("%02d",d_id), string.format("%02d",d_id), table_num))
end

con:query(([[prepare p_new_order8_%d(int2,int4,int2) as UPDATE stock%d
SET s_quantity =$1
WHERE s_i_id = $2
AND s_w_id= $3]]):
format(table_num, table_num))


con:query(([[prepare p_new_order9_%d(int4,int2,int2,int2,int4,int2,int2,float8,text) as INSERT INTO order_line%d
(ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)]]):
format(table_num, table_num))


con:query(([[prepare p_payment1_%d(float8,int2) as UPDATE warehouse%d
SET w_ytd = w_ytd + $1
WHERE w_id = $2]]):format(table_num, table_num))

con:query(([[prepare p_payment2_%d(int2) as SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name
FROM warehouse%d
WHERE w_id = $1]]):format(table_num, table_num))

con:query(([[prepare p_payment3_%d(float8,int2,int2) as UPDATE district%d
SET d_ytd = d_ytd + $1
WHERE d_w_id = $2
AND d_id= $3]]):format(table_num, table_num))

con:query(([[prepare p_payment4_%d(int2,int2) as SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name
FROM district%d
WHERE d_w_id = $1
AND d_id = $2]]):format(table_num, table_num))

con:query(([[prepare p_payment5_%d(int2,int2,text) as SELECT count(c_id) namecnt
FROM customer%d
WHERE c_w_id = $1
AND c_d_id=$2
AND c_last=$3]]):format(table_num, table_num))

con:query(([[prepare p_payment6_%d(int2,int2,text) as SELECT c_id
FROM customer%d
WHERE c_w_id = $1 AND c_d_id= $2
AND c_last=$3 ORDER BY c_first]]):format(table_num, table_num))

con:query(([[prepare p_payment7_%d(int2,int2,int4) as SELECT c_first, c_middle, c_last, c_street_1,
c_street_2, c_city, c_state, c_zip, c_phone,
c_credit, c_credit_lim, c_discount, c_balance, c_ytd_payment, c_since
FROM customer%d
WHERE c_w_id = $1
AND c_d_id= $2
AND c_id=$3 FOR UPDATE]])
:format(table_num, table_num))

con:query(([[prepare p_payment8_%d(int2,int2,int4) as SELECT c_data
FROM customer%d
WHERE c_w_id = $1
AND c_d_id = $2
AND c_id= $3]]):
format(table_num, table_num))

con:query(([[prepare p_payment9_%d(float8,float8,text,int2,int2,int4) as UPDATE customer%d
SET c_balance=$1, c_ytd_payment=$2, c_data=$3
WHERE c_w_id = $4
AND c_d_id = $5
AND c_id = $6]])
:format(table_num, table_num ))

con:query(([[prepare p_payment10_%d(float8,float8,int2,int2,int4) as UPDATE customer%d
SET c_balance=$1, c_ytd_payment=$2
WHERE c_w_id = $3
AND c_d_id = $4
AND c_id = $5]])
:format(table_num, table_num ))

con:query(([[prepare p_payment11_%d(int2,int2,int4,int2,int2,float8,text) as INSERT INTO history%d
(h_c_d_id, h_c_w_id, h_c_id, h_d_id, h_w_id, h_date, h_amount, h_data)
VALUES ($1,$2,$3,$4,$5,NOW(),$6,$7)]])
:format(table_num, table_num))


con:query(([[prepare p_orderstatus1_%d(int2,int2,text) as SELECT count(c_id) namecnt
FROM customer%d
WHERE c_w_id = $1
AND c_d_id= $2
AND c_last=$3]]):
format(table_num, table_num))


con:query(([[prepare p_orderstatus2_%d(int2,int2,text) as SELECT c_balance, c_first, c_middle, c_id
FROM customer%d
WHERE c_w_id = $1
AND c_d_id= $2
AND c_last=$3 ORDER BY c_first]]):
format(table_num, table_num))

con:query(([[prepare p_orderstatus3_%d(int2,int2,int4) as SELECT c_balance, c_first, c_middle, c_last
FROM customer%d
WHERE c_w_id = $1
AND c_d_id= $2
AND c_id=$3]])
:format(table_num, table_num ))

con:query(([[prepare p_orderstatus4_%d(int2,int2,int4) as SELECT o_id, o_carrier_id, o_entry_d
FROM orders%d
WHERE o_w_id = $1
AND o_d_id = $2
AND o_c_id = $3
ORDER BY o_id DESC]]):
format(table_num, table_num ))

con:query(([[prepare p_orderstatus5_%d(int2,int2,int4) as SELECT ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_delivery_d
FROM order_line%d WHERE ol_w_id = $1 AND ol_d_id = $2 AND ol_o_id = $3]])
:format(table_num, table_num ))


con:query(([[prepare p_delivery1_%d(int2,int2) as SELECT no_o_id
FROM new_orders%d
WHERE no_d_id = $1
AND no_w_id = $2
ORDER BY no_o_id ASC LIMIT 1 FOR UPDATE]])
:format(table_num, table_num))

con:query(([[prepare p_delivery2_%d(int4,int2,int2) as DELETE FROM new_orders%d
WHERE no_o_id = $1
AND no_d_id = $2
AND no_w_id = $3]])
:format(table_num, table_num))

con:query(([[prepare p_delivery3_%d(int4,int2,int2) as SELECT o_c_id
FROM orders%d
WHERE o_id = $1
AND o_d_id = $2
AND o_w_id = $3]])
:format(table_num, table_num))

con:query(([[prepare p_delivery4_%d(int2,int4,int2,int2) as UPDATE orders%d
SET o_carrier_id = $1
WHERE o_id = $2
AND o_d_id = $3
AND o_w_id = $4]])
:format(table_num, table_num))

con:query(([[prepare p_delivery5_%d(int4,int2,int2) as UPDATE order_line%d
SET ol_delivery_d = NOW()
WHERE ol_o_id = $1
AND ol_d_id = $2
AND ol_w_id = $3]])
:format(table_num, table_num))

con:query(([[prepare p_delivery6_%d(int4,int2,int2) as SELECT SUM(ol_amount) sm
FROM order_line%d
WHERE ol_o_id = $1
AND ol_d_id = $2
AND ol_w_id = $3]])
:format(table_num, table_num))


con:query(([[prepare p_delivery7_%d(float8,int4,int2,int2) as UPDATE customer%d
SET c_balance = c_balance + $1,
c_delivery_cnt = c_delivery_cnt + 1
WHERE c_id = $2
AND c_d_id = $3
AND c_w_id = $4]])
:format(table_num, table_num))



con:query(([[prepare p_stocklevel1_%d(int2,int2) as SELECT d_next_o_id
FROM district%d
WHERE d_id = $1 AND d_w_id= $2]])
:format( table_num, table_num ))


con:query(([[prepare p_stocklevel2_%d(int2,int2,int4,int4,int2,int2) as SELECT COUNT(DISTINCT (s_i_id))
FROM order_line%d, stock%d
WHERE ol_w_id = $1
AND ol_d_id = $2
AND ol_o_id < $3
AND ol_o_id >= $4
AND s_w_id= $5
AND s_i_id=ol_i_id
AND s_quantity < $6 ]])
:format(table_num, table_num, table_num ))

con:query(([[prepare p_stocklevel3_%d(int2,int2,int4,int4) as SELECT DISTINCT ol_i_id FROM order_line%d
WHERE ol_w_id = $1 AND ol_d_id = $2
AND ol_o_id < $3 AND ol_o_id >= $4]])
:format(table_num, table_num ))

con:query(([[prepare p_stocklevel4_%d(int2,int4,int2) as SELECT count(*) FROM stock%d
WHERE s_w_id = $1 AND s_i_id = $2
AND s_quantity < $3]])
:format(table_num, table_num) )




con:query(([[prepare p_purge1_%d(int2,int2) as SELECT min(no_o_id) mo
FROM new_orders%d
WHERE no_w_id = $1 AND no_d_id = $2]])
:format(table_num, table_num))

con:query(([[prepare p_purge2_%d(int2,int2,int4) as SELECT o_id FROM orders%d o,
(SELECT o_c_id,o_w_id,o_d_id,count(distinct o_id) FROM orders%d WHERE o_w_id=$1 AND o_d_id=$2 AND o_id > 2100
AND o_id < $3 GROUP BY o_c_id,o_d_id,o_w_id having count( distinct o_id) > 1 limit 1) t
WHERE t.o_w_id=o.o_w_id and t.o_d_id=o.o_d_id and t.o_c_id=o.o_c_id limit 1 ]])
:format(table_num, table_num, table_num))

con:query(([[prepare p_purge3_%d(int2,int2,int4) as DELETE FROM order_line%d where ol_w_id=$1 AND ol_d_id=$2 AND ol_o_id=$3]])
:format(table_num, table_num))

con:query(([[prepare p_purge4_%d(int2,int2,int4) as DELETE FROM orders%d where o_w_id=$1 AND o_d_id=$2 and o_id=$3]])
:format(table_num, table_num))

con:query(([[prepare p_purge5_%d(int2,int2) as DELETE FROM history%d where ctid = any (array(select ctid from history%d where h_w_id=$1 AND h_d_id=$2 LIMIT 10))]])
:format(table_num, table_num, table_num ))

end
end
end

function event()
Expand Down Expand Up @@ -65,9 +330,9 @@ end
function sysbench.hooks.report_intermediate(stat)
-- -- print("my stat: ", val)
if sysbench.opt.report_csv == "yes" then
sysbench.report_csv(stat)
sysbench.report_csv(stat)
else
sysbench.report_default(stat)
sysbench.report_default(stat)
end
end

Expand Down
Loading