HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

TIPS: 如何获取数据的存储大小

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2009-12-30 09:10:55

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

    有些同学在估算数据的物理存储大小时会使用length函数,实际上这不正确,真正用于获取数据物理字节数的函数是sys_op_opnsize (10g)。length函数获取到的是数据的逻辑长度,而非物理长度。例如数字,逻辑长度是按照10进制得到的,而其物理存储是按照16进制。   

SQL代码
  1. HELLODBA.COM>insert into demo.tt values (10);   
  2.   
  3. 1 row created.   
  4.   
  5. HELLODBA.COM>insert into demo.tt values (100);   
  6.   
  7. 1 row created.   
  8.   
  9. HELLODBA.COM>insert into demo.tt values (999);   
  10.   
  11. 1 row created.   
  12.   
  13. HELLODBA.COM>insert into demo.tt values (1000);   
  14.   
  15. 1 row created.   
  16.   
  17. HELLODBA.COM>insert into demo.tt values (9999);   
  18.   
  19. 1 row created.   
  20.   
  21. HELLODBA.COM>select sys_op_opnsize(x), length(x),x,dump(x) from demo.tt;   
  22.   
  23. SYS_OP_OPNSIZE(X)  LENGTH(X)          X DUMP(X)   
  24. ----------------- ---------- ---------- ---------------------------   
  25.                 2          2         10 Typ=2 Len=2: 193,11   
  26.                 2          3        100 Typ=2 Len=2: 194,2   
  27.                 3          3        999 Typ=2 Len=3: 194,10,100   
  28.                 2          4       1000 Typ=2 Len=2: 194,11   
  29.                 3          4       9999 Typ=2 Len=3: 194,100,100   
  30.                 2          1          1 Typ=2 Len=2: 193,2   
  31.                 2          1          1 Typ=2 Len=2: 193,2   
  32.   
  33. rows selected.   

    通过对比dump出来结果,很容易发现SYS_OP_OPNSIZE和LENGTH的区别。对于字符数据,则其物理存储长度与字符集相关:

SQL代码
  1. HELLODBA.COM>create table ts (a varchar2(10), b nvarchar2(10));   
  2.   
  3. Table created.   
  4.   
  5. HELLODBA.COM>insert into ts values ('A''A');   
  6.   
  7. 1 row created.   
  8.   
  9. HELLODBA.COM>insert into ts values ('AA''AA');   
  10.   
  11. 1 row created.   
  12.   
  13. HELLODBA.COM>insert into ts values ('AAA''AAA');   
  14.   
  15. 1 row created.   
  16.   
  17. HELLODBA.COM>select a,sys_op_opnsize(a) v, length(a),dump(a),b,sys_op_opnsize(b) v, length(b),dump(b   
  18. from demo.ts;   
  19.   
  20. A                   V  LENGTH(A) DUMP(A)                       B                   V  LENGTH(B) DUMP(B)   
  21. ---------- ---------- ---------- ----------------------------- ---------- ---------- ---------- -----------------------------   
  22. A                   1          1 Typ=1 Len=1: 65               A                   2          1 Typ=1 Len=2: 0,65   
  23. AA                  2          2 Typ=1 Len=2: 65,65            AA                  4          2 Typ=1 Len=4: 0,65,0,65   
  24. AAA                 3          3  Typ=1 Len=3: 65,65,65        AAA                 6          3 Typ=1 Len=6: 0,65,0,65,0,65   

    --- Fuyuncat Mark ---
 

Top

Copyright ©2005,HelloDBA.Com 保留一切权利

申明
by fuyuncat