Oracle 的 char number varchar2 效率測試

來源:互聯網
上載者:User

自己在建表的時候,用到了編號的這個欄位,

主要問題是要用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語句塊,執行一下就可以。
declare
  v_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 loop
    v_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;


--下面開始測試
declare
  v_beg timestamp;--一定要記好開始時間
  v_end timestamp;--和結束時間
  v_times number := 100000;
begin
  --測試尋找第50000條資料的速度
  v_beg := systimestamp;
  for i in 1..v_times loop
    execute 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 loop
    execute 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 loop
    execute 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,差的也不大,也都能接受。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.