存储过程中变量类型:number,pls_integer,small integer

今天在查看批量提交脚本时发现,很多存储过程变量定义整形时都是使用PLS_INTEGER,不禁疑惑它跟number有什么不同。


查看一些资料:


PLS_INTEGER Datatype
You use the PLS_INTEGER datatype to store signed integers. Its magnitude range is -2147483648 to 2147483647, represented in 32 bits. PLS_INTEGER values require less storage than NUMBER values and NUMBER subtypes. Also, PLS_INTEGER operations use hardware arithmetic, so they are faster than NUMBER operations, which use library arithmetic. For efficiency, use PLS_INTEGER for all calculations that fall within its magnitude range. For calculations outside the range of PLS_INTEGER, you can use the INTEGER datatype.


Benefits of Using PLS_INTEGER Datatype in PL/SQL

If you have a whole-number counter, for example in a loop or record counter, consider using a datatype ofPLS_INTEGER instead of INTEGER or NUMBER. When declaring an integer variable, PLS_INTEGER is the most efficient numeric datatype because its values require less storage than INTEGER or NUMBER values, which are represented internally as 22-byte Oracle numbers. Also, PLS_INTEGER operations use machine arithmetic, so they are faster than BINARY_INTEGER, INTEGER, or NUMBER operations, which use library arithmetic.


TIPS:


1)pls_integer类型也是数字类型,但和number类型不同,number可以存储实数,而pls_integer只能存储-2147483647到+2147483647之间的整数,如果使用pls_integer类型时发生溢出,系统将会报错。
2)binary_integer与pls_integer类似,在9.2版本以前大量使用,从9.2以后,从Oracle内部一些组件可以看的出,大有被pls_integer取代之势(pls_integer比binary_integer具有更少的存储开销和更好的访问性能,所以Oracle从9.2以后推荐你尽量能使用pls_integer就使用pls_integer)。它也是只能存储-2147483647到+2147483647之间的整数。
3)在oracle 11g中,又增加了一个新的类似的数据类型simple_integer,不过simple_integer不能包含空值,它的取值范围是[-2147483648..2147483647]。在11g中,simple_integer相对pls_integer在性能上又有所提高,如果在实际的pl/sql中既不需要overflow检查也不会包含null值,Oracle建议你使用simple_integer.


做了一个简单的测试,1个包含123w条数据表某个字段的更新操作。


declare
  rnt number(4):= 0;  ------------此处变换类型为 pls_integer,small integer
begin
  for idx in (select rowid rid from autotest.photo_test ) loop
    update  test.photo_test  set point =  point * 100 where rowid = idx.rid;
    rnt := rnt + 1;
    if rnt = 2000 then
      rnt := 0;
      commit;
    end if;
  end loop;
  commit;
end;


消耗的时间分别为 


simple_integer :00:06:49.97

pls_integer    :00:08:08.41

number         :00:08:19.05

number(4)    :00:03:37.89


因为只是个简单的测试,所以没有重复测试,测试结果可能有些偏差。不过大致可以看出,消耗的时间跟变量的类型有关。

同为34位时,效率上使用 simple_integer>pls_integer>number,但是指定number位数以后可以看到速度有明显提升,所以尽量明确整形类型的精度,少占空间才是王道。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值