binbin007,看来你的情况和我一样,但我不太明白为什么你的程序中不用ID?如果程序中不用ID,那么如何在数据库中全部使用ID进行相关操作?可能我的开发方式与你不一样?我是用B/S模式,三层结构,在程序中需要使用SQL语句进行数据读取、查询。因而,以你所举的例子来看,比如我想要读取某一条记录,我的程序中会有诸如“SELECT * FROM TEST WHERE ID = xxx”的SQL语句,如果不用ID的话,用什么呢?用住院号字段?那岂不是ID没有用到?能解释一下吗?不胜感激!sunluo,你的讲法也有道理,我以前就是这样,采用CHAR,并建索引,但速度很慢,所以才想换一种方式。而且CHAR和VARCHAR一样,都是字符串,都需要逐个比较,想来不如数字类型的快吧?
还有一种更快的方法: 比如:单独一个ID可确定唯一,病人(NAME)+房号(ROOM)也可以确定唯一 若三个字段都有建索引的话, 那么: select * from table where NAME = XXX and ROOM = XXX; 就要比: select * from table where ID = XXX; 快! 所以你可以看看你的SELECT语句!说到这,还是如 leecooper0918 所说,优化你的SELECT 对速度也很重要! 具体情况,看看你的情况再找找资料吧!
1.对于类似 select * from tablename where colname =:1 这样的语句,因为使用了绑定变量,所以对共享池的大小和使用 效率很敏感; 但是如果系统中没有什么动态sql,或是根本不使用绑定变量,共享池 配的再大也没用,因为系统进行的是硬解析,可伸缩性受到制约。 索引不是万能的,但没有索引是万万不能的。2. 复合索引确实在很多情况下比基于单列的索引效率好,因为它扫描 更少的路径树节点.
我不觉得 varchar2 比 number 慢 oracle中的这些数据的存储还不是 2 进制 select dump(12,16) from dual; -- 这不是number的存储方式了 同理可看 varchar2的我没证实过
比如病人的住院号和ID号分开存储,住院号与ID一一对应,
住院号用VARCHAR2病人ID用序列生成。
在程序中看不到ID,但在数据库中全部使用ID进行相关操作!
会比varchar2快一些。我以前就是这样,采用CHAR,并建索引,但速度很慢
----------------------------------------------
这个问题我觉得不是出在你用什么数据类型上,而是属于另外一个问题,
即查询的性能调整。对于一个性能不好的SQL语句,首先要看查询计划,
然后再作下一步的调整。
速度问题,char,number那个快我不确定,
但我这的一个表,16万条记录,以char为关键字,有索引,很快!我觉得在有一个不错的索引的情况下,还是很慢,就要转移一下角度,
不知大家是否知道共享池的大小跟速度有很大的关系!
还有你表空间、缓冲等的设置!
看看哪些,说不定这才是关键!当然服务器本身最重要!
比如:单独一个ID可确定唯一,病人(NAME)+房号(ROOM)也可以确定唯一
若三个字段都有建索引的话,
那么:
select * from table where NAME = XXX and ROOM = XXX;
就要比:
select * from table where ID = XXX;
快!
所以你可以看看你的SELECT语句!说到这,还是如 leecooper0918 所说,优化你的SELECT 对速度也很重要!
具体情况,看看你的情况再找找资料吧!
这样的语句,因为使用了绑定变量,所以对共享池的大小和使用
效率很敏感; 但是如果系统中没有什么动态sql,或是根本不使用绑定变量,共享池
配的再大也没用,因为系统进行的是硬解析,可伸缩性受到制约。 索引不是万能的,但没有索引是万万不能的。2. 复合索引确实在很多情况下比基于单列的索引效率好,因为它扫描
更少的路径树节点.
oracle中的这些数据的存储还不是 2 进制
select dump(12,16) from dual; -- 这不是number的存储方式了 同理可看 varchar2的我没证实过
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类型(代码)来做主键更好。
感谢大家参与讨论,对我很有启发。