如果表的主键用NUMBER类型,是否在用“SELECT * FROM TEST WHERE ID = xxx”这种类型的SQL语句时比之VARCHAR类型的要快?因为VARCHAR类型如果较长的话,数据库将会逐个逐个字符比较,这样,它找出该条记录的速度比较慢,是这样吗?

解决方案 »

  1.   

    如果是这样的话,比如现在有一个表,存放员工信息,每个员工有工号,由数字和字母组成。该字段用VARCHAR(5)类型,我原来打算用工号字段做主键,现在是否另外用一列类型为NUMBER(10)的字段做主键较合适?该字段我想采用序列生成,为整数,每次加一,不知这个想法对不对?
      

  2.   

    这个想法不错,我们的表就是这样设计的,
    比如病人的住院号和ID号分开存储,住院号与ID一一对应,
    住院号用VARCHAR2病人ID用序列生成。
    在程序中看不到ID,但在数据库中全部使用ID进行相关操作!
      

  3.   

    其实你做主键为什么不用CHAR型?另外若真得检索的数据量很大,而且对速度的要求又较高,最好把索引建好一点!
      

  4.   

    binbin007,看来你的情况和我一样,但我不太明白为什么你的程序中不用ID?如果程序中不用ID,那么如何在数据库中全部使用ID进行相关操作?可能我的开发方式与你不一样?我是用B/S模式,三层结构,在程序中需要使用SQL语句进行数据读取、查询。因而,以你所举的例子来看,比如我想要读取某一条记录,我的程序中会有诸如“SELECT * FROM TEST WHERE ID = xxx”的SQL语句,如果不用ID的话,用什么呢?用住院号字段?那岂不是ID没有用到?能解释一下吗?不胜感激!sunluo,你的讲法也有道理,我以前就是这样,采用CHAR,并建索引,但速度很慢,所以才想换一种方式。而且CHAR和VARCHAR一样,都是字符串,都需要逐个比较,想来不如数字类型的快吧?
      

  5.   

    CHAR是定长,varchar2是定长,如果都有索引的话,访问char列的速度
    会比varchar2快一些。我以前就是这样,采用CHAR,并建索引,但速度很慢
    ----------------------------------------------
     这个问题我觉得不是出在你用什么数据类型上,而是属于另外一个问题,
     即查询的性能调整。对于一个性能不好的SQL语句,首先要看查询计划,
     然后再作下一步的调整。
      

  6.   

    写错了一个字: varchar2是变长.
      

  7.   

    leecooper0918,sashalin:
    速度问题,char,number那个快我不确定,
    但我这的一个表,16万条记录,以char为关键字,有索引,很快!我觉得在有一个不错的索引的情况下,还是很慢,就要转移一下角度,
    不知大家是否知道共享池的大小跟速度有很大的关系!
    还有你表空间、缓冲等的设置!
    看看哪些,说不定这才是关键!当然服务器本身最重要!
      

  8.   

    还有一种更快的方法:
    比如:单独一个ID可确定唯一,病人(NAME)+房号(ROOM)也可以确定唯一
    若三个字段都有建索引的话,
    那么:
    select * from table where NAME = XXX and ROOM = XXX;
    就要比:
    select * from table where ID = XXX;
    快!
    所以你可以看看你的SELECT语句!说到这,还是如 leecooper0918 所说,优化你的SELECT 对速度也很重要!
    具体情况,看看你的情况再找找资料吧!
      

  9.   

    1.对于类似 select * from tablename where colname =:1
       这样的语句,因为使用了绑定变量,所以对共享池的大小和使用
       效率很敏感;   但是如果系统中没有什么动态sql,或是根本不使用绑定变量,共享池
       配的再大也没用,因为系统进行的是硬解析,可伸缩性受到制约。   索引不是万能的,但没有索引是万万不能的。2. 复合索引确实在很多情况下比基于单列的索引效率好,因为它扫描
       更少的路径树节点.
     
      

  10.   

    我不觉得 varchar2 比 number 慢 
    oracle中的这些数据的存储还不是 2 进制
    select dump(12,16) from dual;  -- 这不是number的存储方式了 同理可看 varchar2的我没证实过
      

  11.   

    建议大家看一下这两篇文章,对这个问题从不同的角度作了很好阐述:
    http://www.sqlmag.com/Articles/Index.cfm?ArticleID=5113&pg=2
    http://www.zdnet.com.cn/developer/code/story/0,2000081534,39190869,00.htm
    我的结论如下:
    1。如果表的数据量很大,且表本身经常被查询,可采用一无实际意义的NUMBER类型作为主键,称为“代理键”,速度快,且当数据变更时,主键无需变更
    单从速度来看,NUMBER比CHAR快,CHAR比VARCHAR快。
    2。如果查询表本身不经常被查询,而是在大表查询时与大表连接,在WHERE子句中起过滤条件的作用,则采用一有意义的VARCHAR类型(代码)来做主键更好。
    感谢大家参与讨论,对我很有启发。