问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用 sysbench 并行装载 PostgreSQL 测试数据

发布网友 发布时间:2022-04-27 12:02

我来回答

2个回答

懂视网 时间:2022-04-30 12:59

Navicat Premium Data Transfer Source Server : localhost Source Server Type : PostgreSQL Source Server Version : 90401 Source Host : localhost Source Database : mmc Source Schema : public Target Server Type : PostgreSQL Target Server Version : 90401 File Encoding : utf-8 Date: 08/15/2015 20:24:56 PM */ -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS "public"."student"; CREATE TABLE "public"."student" ( "id" int4 NOT NULL DEFAULT nextval(‘student_id_seq‘::regclass), "name" varchar(255) NOT NULL DEFAULT ‘‘::character varying COLLATE "default", "age" int4 NOT NULL DEFAULT 0 ) WITH (OIDS=FALSE); ALTER TABLE "public"."student" OWNER TO "mmc"; -- ---------------------------- -- Records of student -- ---------------------------- BEGIN; INSERT INTO "public"."student" VALUES (‘1‘, ‘tom‘, ‘25‘); COMMIT; -- ---------------------------- -- Primary key structure for table student -- ---------------------------- ALTER TABLE "public"."student" ADD PRIMARY KEY ("id") NOT DEFERRABLE INITIALLY IMMEDIATE;

 

直接贴代码

package main

import (
 "fmt"
 "github.com/go-xorm/xorm"
 _ "github.com/lib/pq"
 "reflect"
 "unsafe"
)

var engine *xorm.Engine

func BytesToString(b []byte) string {
 bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
 sh := reflect.StringHeader{bh.Data, bh.Len}
 return *(*string)(unsafe.Pointer(&sh))
}

func StringToBytes(s string) []byte {
 sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
 bh := reflect.SliceHeader{sh.Data, sh.Len, 0}
 return *(*[]byte)(unsafe.Pointer(&bh))
}

func main() {
 engine, _ = xorm.NewEngine("postgres", "user=mmc password=mmc dbname=mmc host=127.0.0.1 port=5432 sslmode=disable")
 sql := "select * from student"
 rowArray, _ := engine.Query(sql)
 for _, row := range rowArray {
 for colName, colValue := range row {
  value := BytesToString(colValue)
  fmt.Println(colName, value)
 }
 }
}

 

xorm使用pgsql的例子

标签:

热心网友 时间:2022-04-30 10:07

sysbench原来自带的lua数据装载脚本是使用以下方式串行装载的,速度比较慢(比单条insert快,但是比COPY慢)。
insert into table1 values (),(),()....
insert into table2 values (),(),()....
...
insert into tablen values (),(),()....
使用prepare导入数据的用法举例
./sysbench_pg --test=lua/oltp.lua --db-driver=pgsql --pgsql-host=127.0.0.1 --pgsql-port=1921 --pgsql-user=postgres --pgsql-password=postgres --pgsql-db=postgres --oltp-tables-count=64 --oltp-table-size=1000000 --num-threads=64 prepare
prepare 表示装载数据,但是它串行的。
sysbench0.5中可以在命令行中指定测试时启动的并行线程数,这个测试过程是使用run命令,而且是多线程并发的,所以我们可以使用sysbench的run命令来造数据,而不再使用其提供的prepare命令的方法来造数据。run命令会根据命令行参数--num-threads来指定并发线程数的多少。
在sysbench中自定义的lua脚本中要求实现以下几个函数:
function thread_init(thread_id): 此函数在线程创建后只被执行一次
function event(thread_id): 每执行一次就会被调用一次。
由上可以知道,本次造数据的脚本我们只需要实现thread_init()函数就可以了。
生成测试数据的脚本沿用老唐提供的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include <sys/time.h>
uint64_t my_rand(struct random_data * r1, struct random_data * r2)
{
uint64_t rand_max = 100000000000LL;
uint64_t result;
uint32_t u1, u2;
random_r(r1, &u1);
random_r(r2, &u2);
result = (int64_t)u1 * (int64_t)u2;
result = result % rand_max;
return result;
}
int main(int argc, char *argv[])
{
struct timeval tpstart;
struct random_data r1, r2;
int i;
int r;
int max_value;
char rand_state1[128];
char rand_state2[128];
if (argc !=2)
{
printf("Usage: %s <rownums>\n", argv[0]);
return 1;
}
max_value = atoi(argv[1]);
gettimeofday(&tpstart,NULL);
initstate_r(tpstart.tv_usec,rand_state1,sizeof(rand_state1),&r1);
srandom_r(tpstart.tv_usec, &r1);
gettimeofday(&tpstart,NULL);
initstate_r(tpstart.tv_usec,rand_state2,sizeof(rand_state1),&r2);
srandom_r(tpstart.tv_usec, &r2);
for (i=1; i<max_value+1; i++)
{
r = my_rand(&r1, &r2) % max_value;
printf("%d,%d,%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu,%011llu-%011llu-%011llu-%011llu-%011llu\n",
i,
r,
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2),
my_rand(&r1, &r2)
);
}
return 0;
}
编译此C语言程序的方法如下:
gcc gendata.c -o gendata
新建一个copy.lua的脚本,内容如下
调用 common.lua中的 set_vars() 继承来自 common.lua 的全局变量。
函数 copydata(table_id) : 创建表,创建管道,将管道数据传输到psql -c "copy ..."客户端的方式导入数据。
函数 create_index(table_id) : 创建索引,调整SEQUENCE next val。
注意咯, oltp_tables_count 必须是 num_threads 的倍数,在 thread_init 中, 以num_threads 为步调,以thread_id+1为起始值,设置i的值,并调用copydata(table_id)和create_index(table_id)。
$ vi lua/copy.lua
pathtest = string.match(test, "(.*/)") or ""
dofile(pathtest .. "common.lua")
function copydata(table_id)
local query
query = [[
CREATE UNLOGGED TABLE sbtest]] .. table_id .. [[ (
id SERIAL NOT NULL,
k INTEGER,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) ]]
db_query(query)
os.execute ('export PGPASSWORD=' .. pgsql_password)
os.execute ('rm -f sbtest' .. table_id .. '.dat')
os.execute ('mknod sbtest' .. table_id .. '.dat p')
os.execute ('./gendata ' .. oltp_table_size .. ' >> sbtest'..table_id ..'.dat &')
os.execute ('cat sbtest' .. table_id .. '.dat | psql -h ' .. pgsql_host .. ' -p ' .. pgsql_port .. ' -U ' .. pgsql_user .. ' -d ' .. pgsql_db .. ' -c "copy sbtest' .. table_id .. ' from stdin with csv"')
os.execute ('rm -f sbtest' .. table_id .. '.dat')
end
function create_index(table_id)
db_query("select setval('sbtest" .. table_id .. "_id_seq', " .. (oltp_table_size+1) .. ")" )
db_query("CREATE INDEX k_" .. table_id .. " on sbtest" .. table_id .. "(k)")
end
function thread_init(thread_id)
set_vars()
print("thread prepare"..thread_id)
for i=thread_id+1, oltp_tables_count, num_threads do
copydata(i)
create_index(i)
end
end
function event(thread_id)
os.exit()
end
用法,必须把psql放到路径中,因为lua中需要用到psql命令
export PATH=/home/digoal/pgsql9.5/bin:$PATH
生成数据,速度比以前快多了
./sysbench_pg --test=lua/copy.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=1921 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=postgres \
--oltp-tables-count=64 \
--oltp-table-size=1000000 \
--num-threads=64 \
run
清除数据, drop table
./sysbench_pg --test=lua/copy.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=1921 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=postgres \
--oltp-tables-count=64 \
--oltp-table-size=1000000 \
--num-threads=64 \
cleanup
lua全局变量代码:
sysbench/scripting/lua/src/lua.h:#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
sysbench/scripting/lua/src/lua.h:#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s))
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "_G");
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "_VERSION"); /* set global _VERSION */
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "newproxy"); /* set global `newproxy' */
sysbench/scripting/script_lua.c: lua_setglobal(state, opt->name);
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_uniq");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rnd");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_str");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_uniform");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_gaussian");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_special");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_connect");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_disconnect");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_query");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_init");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_next");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_done");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_prepare");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bind_param");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bind_result");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_execute");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_close");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_store_results");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_free_results");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_NONE");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_DEADLOCK");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_FAILED");
sysbench/scripting/script_lua.c: lua_setglobal(L, "db_driver");
传入参数,可以把sysbench_pg的参数-替换成_在lua脚本中使用这些变量,例子
--pgsql-host=127.0.0.1 -> 对应lua中的变量名 pgsql_host
--pgsql-port=1921 -> 对应lua中的变量名 pgsql_port
--pgsql-user=postgres -> 对应lua中的变量名 pgsql_user
--pgsql-password=postgres -> 对应lua中的变量名 pgsql_password
--pgsql-db=postgres -> 对应lua中的变量名 pgsql_db
--oltp-tables-count=64 -> 对应lua中的变量名 oltp_tables_count
--oltp-table-size=1000000 -> 对应lua中的变量名 oltp_table_size
--num-threads=64 -> 对应lua中的变量名 num_threads
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
潍坊哪里有卖有影像的游戏王决斗盘 游戏王决斗盘哪卖? 中国有卖〔游戏王〕动画片中的战斗盘的吗?如果有,安徽哪有卖的? ___有两个端点,___只有一个端点,___没有端点 线段线段有两个端点,射线射线只有一个端点,直线直线没有端点._百度知 ... 监理费,设计费,勘探费,咨询费可否计入固定资产单 工程设计计入什么科目 求爱情语录 像送心爱的人回家 哪都顺路这种超经典超浪漫超温馨的_百度... 内眼角起疱是怎么回事 新绝代双骄之鱼戏江湖 怎么玩不了? 求解 补牙疼吗 要带牙冠吗 补充如下 补牙后还有做牙冠吗 补牙后装牙冠套的问题 6岁儿童龋齿补牙后医生建议戴牙冠,请问这对孩子以后换牙有影响吗? 补牙之后也要带牙套吗? 关于补牙后牙冠使用的注意事项,谢谢! 刚刚补牙、戴了牙冠可以刷牙吗? 补牙后多久装牙冠 补牙了,一定要带牙冠吗? 补牙之后为什么要戴个牙冠套 牙齿烂了之后,补牙后医生建议要戴牙冠,真的有必要吗?为什么? 鞋子有折痕还能无理由退换吗? 怎么消除鞋子上的折痕 为什么我买的nike空军包括nike联名 高帮的 穿久了前面都出现了折痕 这是为什么,能去除么求解 为什么板鞋前面总是有褶子 为什么我总会把鞋子前面穿的有皱褶??? 走路时为什么鞋前沿上会折上许多皱 如何去除板鞋上的折痕 为什么鞋子会有折痕 Nike板鞋鞋头出褶皱怎么办?? 测试嵌入式 postgresql 管理数据库是否在具有足够可用空间的分区上运... 测试MySQL和Postgresql数据库查询性能怎么做到单线程和多线程查询_百度... android studio 怎么与postgresql数据库一起测试 adempiere3.7 postgresql 安装时测试总是失败,怎么回事?日志如下 postgresql 30万数据需要分表吗 为什么这么Solr的比Postgres的更快 测试postgesql odbc是否安装成功 cdh 怎么测试cloudera manager 和 postgresql的连接 我用qt编登录界面,数据库是postgre,在ODBC里面测试成功。但qt运行程序... 怎么让苹果手机自动搜索归纳成人物头像? 苹果手机用什么软件可以图片搜索,百度有吗 苹果手机一进百度就有黄色网页弹出来怎么办?求高手指点谢谢 苹果手机没有越狱怎么看成人节目 如何将iphone+x改成成人模式 买医保网上怎么买 ios9.0.2 系统的苹果手机,一打开百度搜索就出现如下图的*链接图片。求各位高手解决 苹果手机那些成人社交软件是自带的吗? 微信医保在哪里交 网上能缴纳医保费吗 洗澡用沐浴露好不好?