自己在建表的时候,用到了编号的这个字段,
主要问题是要用java连接数据库,所以要有pojo类,
就像 编号 这种字段,int 不够,long 转起来麻烦,还容易出错。
突然想看看char可不可以,所以就稀里糊涂的想看看,这几种数据类型的查找效率究竟如何。
--首先总要先建立一张表吧(如果有重复的话,先删掉...)
drop table yard_test;
create table yard_test (yrd_id char(32),yrd_num number,yrd_var varchar2(32),into_time date,yrd_txt varchar2(4000)
);--必然要有需要的数据类型 char number varchar2--下面可以插入数据了,建一个plsql语句块,执行一下就可以。
declarev_temp yard_test%rowtype;v_begin_time timestamp := systimestamp;v_end_time timestamp;v_all_time timestamp;
begin
for i in 1..100 loop--每一万条数据提交一次,总共提交100万次,其实有点多,我都没耐性等他插入完成就......for j in 1..10000 loopv_temp.yrd_id := sys_guid();v_temp.yrd_var := sys_guid();select nvl(max(yrd_num),0)+1 into v_temp.yrd_num from yard_test;--本来应该用sequence的,嫌麻烦,直接用select语句取得max值+1 得到了序号...v_temp.yrd_txt := substr(sys_guid(),1,1);insert into yard_test values(v_temp.yrd_id,v_temp.yrd_num,v_temp.yrd_var,systimestamp,v_temp.yrd_txt);v_end_time := systimestamp;v_all_time := v_all_time + (v_end_time - v_begin_time);--插入数据end loop;commit;dbms_output.put_line(v_all_time);
end loop;
dbms_output.put_line(v_all_time);
end;--好了,可以看看都插入了写什么数据,
select * from yard_test;--下面开始测试
declarev_beg timestamp;--一定要记好开始时间v_end timestamp;--和结束时间v_times number := 100000;
begin--测试查找第50000条数据的速度v_beg := systimestamp;for i in 1..v_times loopexecute immediate 'select * from yard_test where yrd_num = 50000';--用execute直接运行sql语句,这里是通过number查找数据end loop;v_end := systimestamp;dbms_output.put_line('number 查询时间 ' || (v_end-v_beg));v_beg := systimestamp;for i in 1..v_times loopexecute immediate 'select * from yard_test where yrd_id = ''4A6585C231B64BD1B5A981EDD8079990''';end loop;v_end := systimestamp;dbms_output.put_line('char 查询时间 ' || (v_end-v_beg));v_beg := systimestamp;for i in 1..v_times loopexecute immediate 'select * from yard_test where yrd_var = ''18C00CA4677E4BF388BD9F3891BBACA0''';end loop;v_end := systimestamp;dbms_output.put_line('carchar2 查询时间 ' || (v_end-v_beg));
end;
都是 char 效率最高,number 其次,最慢的是varchar2,差的也不大,也都能接受。