近日听同事谈论索引时听说:
假设同样两张表A和B、字段名、数据内容完全一样,同样有一个k列作为表的索引
只是,A中的k列为Varchar2型,B中的k列为NUMBER型,字段长度相同在同样对k列进行查询操作时,A表比B表要快有点想不通,所以特意来这里问一问各位高手,有什么理由么?
还是俺们那位同事在胡说呢?如果可以的话,也请同时提供一下答案的出处等,我也可以自己读一下相关的文章。
谢谢各位了

解决方案 »

  1.   

    VARCHAR2的长度是双字节长度,NUMBER型是数字型,从实际长度上,NUMBER要比VARCHAR2少.在排序比较上,NUMBER得天独厚,而VARCHAR2就算不比它多出多少中转手续,但也不可能比它快.我想可能是他口误吧.
      

  2.   

    听同事说,Varchar2和Number都是Oracle的技术数据类型,但是Number在做操作时也要转化为Varchar2类型,所以速度回慢,是真的么?
    感觉应该不是这样的,但是有没有找到什么权威性的书籍谈到过这里?
    麻烦哪位大哥能够帮忙全面的解释一下,或是告诉我哪里可以找答案?
      

  3.   

    假设你访问两个表的执行计划完全一样,那么我们来分析I/O。一般的,你建的应该是B*Tree索引。对于B*Tree的搜索,一般 B*Tree的层数越高,I/O次数越高。而一个block中存储的索引记录越多,则树的层数应该越少。所以,关键就是,oracle存储number和varchar2,那个更占用空间
      

  4.   

    SQL> select dump(1) from dual;DUMP(1)
    ------------------
    Typ=2 Len=2: 193,2SQL> select dump('1') from dual;DUMP('1')
    ----------------
    Typ=96 Len=1: 49SQL> select dump(12) from dual;DUMP(12)
    -------------------
    Typ=2 Len=2: 193,13SQL> select dump('12') from dual;DUMP('12')
    -------------------
    Typ=96 Len=2: 49,50SQL> select dump(123) from dual;DUMP(123)
    ---------------------
    Typ=2 Len=3: 194,2,24SQL> select dump('123') from dual;DUMP('123')
    ----------------------
    Typ=96 Len=3: 49,50,51SQL> select dump(1234) from dual;DUMP(1234)
    ----------------------
    Typ=2 Len=3: 194,13,35SQL> select dump('1234') from dual;DUMP('1234')
    -------------------------
    Typ=96 Len=4: 49,50,51,52SQL> select dump(12345) from dual;DUMP(12345)
    ------------------------
    Typ=2 Len=4: 195,2,24,46SQL> select dump('12345') from dual;DUMP('12345')
    ----------------------------
    Typ=96 Len=5: 49,50,51,52,53可以看到1位的时候,number比char型的数据占的空间更多。但是数字越大,char型的占用的空间就比number越来越多了。所以,还要根据你数据的具体数据来分析。如果数据量不大,这点差别基本应该没有太多的影响的,你看看两个索引的大小就可以知道了
      

  5.   

    赞同NinGoo(宁缺毋滥) 的观点
    就实际存储来说,对于给定的n, varchar(n)是可变长度 number(n)是固定长度。
    当n小于某个值x时varchar的长度较小
    当n大于某个值x时varchar的长度较大把A、B两张表的k列的平均长度统计出来或许对解释这个现象有帮助
    同时还要考虑两张表是否有其它的不同:优化方式,存储连续性(行链接,索引碎片等),读写属性(只读表会快一些),性能收集数据准确性,索引数据的分布直方图等