注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Postgresql 生成测试数据2  

2011-12-27 22:08:43|  分类: Postgresql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
为了弥补 《PostgreSQL 之 生成测试数据 》中 主键冲突问题。
写了一个新的存储过程,这是用于实际项目的数据测试

新建一个数据表结构:

CREATE TABLE HOST_SNAP (
HOST_NAME varchar(255) NOT NULL ,
TIME_STAMP TIMESTAMP NOT NULL ,
CPU_UT numeric(9,2) DEFAULT NULL ,
PRIMARY KEY (HOST_NAME,TIME_STAMP)
) ;

存储过程:

CREATE OR REPLACE FUNCTION generate_test_data(IN pk text, IN pk_value text, IN table_name text,

IN start_time text, IN end_time text, IN step text)
RETURNS void AS
$$
DECLARE
query_sql text :='';
insert_sql text :='';
insert_sql_1 text :='';
insert_sql_2 text :='';
column_info record;
type_name name :='';
column_name name :='';
BEGIN

-- 根据表名查出各列的类型和列名
query_sql := 'select t.typname as type, a.attname as name from pg_class c, pg_attribute a, pg_type t
where c.relname = '''|| table_name ||''' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid';
-- 组成插入语句
insert_sql_1 := 'insert into '||table_name||'(';
insert_sql_2 := 'values(';

for column_info in execute(query_sql) loop

type_name := column_info.type;
column_name := column_info.name;
--根据类型写表达式拼insert语句
if column_name = pk then
insert_sql_1 := insert_sql_1 || column_name ||',';
insert_sql_2 := insert_sql_2 || '''' || pk_value || '''' || ',';
elsif type_name = 'numeric' then
insert_sql_1 := insert_sql_1 || column_name ||',';
insert_sql_2 := insert_sql_2 || '(random()*(2*10^6))::integer'||',';
elsif type_name = 'varchar' then
insert_sql_1 := insert_sql_1 || column_name ||',';
insert_sql_2 := insert_sql_2 || 'substr(''abcdefghijklmnopqrstuvwxyz'',1, (random()*26)::integer)'||',';
elsif type_name = 'timestamp' then
insert_sql_1 := insert_sql_1 || column_name ||',';
insert_sql_2 := insert_sql_2 || 'generate_series( '|| start_time ||', '|| end_time ||', '''|| step ||''')::timestamp' ||',';
end if;

end loop;

--insert语句生成OK
insert_sql_1 := substring(insert_sql_1 from 1 for char_length(insert_sql_1)-1)||')';
insert_sql_2 := substring(insert_sql_2 from 1 for char_length(insert_sql_2)-1)||')';
insert_sql := insert_sql_1 ||' '||insert_sql_2;
raise notice '%',insert_sql;

--执行insert语句
--raise notice '%',i;
execute(insert_sql);

END;
$$
LANGUAGE 'plpgsql';


实际运行效果:
第一个参数 除time_stamp的另一个主键。
第二个参数 它的值。
第三个参数 起始时间
第四个参数 结束时间
第五个参数 时间间隔

执行语句:(生成host1 12小时的CPU使用率的采样数据,采样间隔是1小时)
select generate_test_data('host_name','host1','host_snap','now()','now() + ''12 hour''','1 hour');

生成数据:
Postgresql 生成测试数据2 - 星期五 - 星期五
 
对于我们测试CPU使用率的chart图表蛮有帮助。

本次存储过程充分利用了generate_series函数 (generate_series使用,详见postgreSQL参考手册)
  评论这张
 
阅读(345)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017