说人轴是什么意思 说一个人“轴”是什么意思

Oracle&数据类型&NUMBER&和&VARCHAR2&的长度
&&&&Oracle的
NUMBER 的整数位最大长度是38(小数位最大长度是127位),VARCHAR2的最大长度是4000。 NUMBER
的默认值是38,VARCHAR2没有默认值,必须指定长度。
&&& 关于 NUMBER
类型在Oracle中的定义, NUMBER
(p[,s]),p为:precision,s为:scale,即小数点右边不超过s位,小数点左边和右边总位数不超过p位。范围: 1
&= p &=38, -84 &= s
&= 127,保存数据范围:-1.0e-130 &= number
value & 1.0e+126&,保存在机器内部的范围: 1 ~
22 bytes。
&&& 如果定义为:id
NUMBER 的话,则precision和scale没有指定,即相当于 NUMBER (38,7)。
&&& 如果定义为:id
(5)的话,则precision为5,scale为0,小数点右边没有位数,小数点左边最多5位数字,如果输入的数字是带小数位的如:12345.71的话,Oracle会自动进行四舍五入,变为:12346,如果输入的是12345.48的话,会自动四舍五入为:12345。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。oracle 的char 类型字段,在数据库中是固定长度的,而varchar2类型的是长度是可以变化的。假设某个字段的类型为char(20),这时将‘abc’保存到这个字段后,其实在数据库中保存的字符仍然是20字节,另外有17个字节是以空格保存的。而以varchar2来进行保存时,实际在机器中只占3个字节。
在效率方面,char的效率会比varchar更高些,这是因为在执行update语句修改varchar类型的字段时,当需要更新的数据比原来的数据需要占用更多的字节时,有可能会需要行迁移,也就是由于原来保存数据的内存地址无法保存需要更新的数据,需要进行数据迁移,更多的I/O。而char由于是固定长度的,update后的内容不会需要行迁移,必然可以保存在原来的地址,不会导致没必要的数据迁移。所以char类型的字段效率会更高些。
varchar类型的字段会更节省空间,由于会基于需要保存的字段基于内容来分配空间,而char类型的字段会固定保存相同的字节,不足的会空格补全。
曾经试过将mysql数据库的一张表在ESB里通过JPA框架将数据保存到另外一个数据库中,在msql数据库中的这张表的主键是自增长的,而在oracle数据库中的表的主键是char类型的,由于当mysql的表中的数据做了修改时,也需要同步到oracle数据库中,所以在数据保存到oracle中时,使用了merge方法,而merge方法实际上是执行了select语句,会以实体的主键字段来判断这条数据是否在表中已存在,当存在时会执行update语句,不存在时会执行insert语句。而当需要对已存在的数据进行更新时,调用merge语句后会执行inert语句,然后会报违反唯一约束错误。但merge语句时应该会执行update语句,后来发现原因是在执行select语句时,由于表的主键时char的类型,会自动填充空格,但select语句的主键并没有补充空格,这时select语句的结果集是返回空,然后执行insert语句,由于这时候主键会自动补全,这时发现表中已存在这个主键,所以报唯一约束错误。
&&&& 假设在mysql中的表的一条数据的主键为1250,这条数据保存到oracle的表中时,这张表的主键为char(20),当对mysql表中的数据中主键为1250的数据修改后同步到oracle时,执行select语句会找不到这条数据,这时需要查询语句的这个字段需要补全空格,长度为20字节。
另外在进行关联查询时,主键为char类型,另一张表的关联字段为number类型时,也会出现无法查找符合关联的数据。这种错误在mysql的工具中执行查询不会出现异常,通常在代码中会出现。当char类型的字段进行查询时,要谨记记得char会自动补空格。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2611次
排名:千里之外2016年1月 Oracle大版内专家分月排行榜第一2015年6月 Oracle大版内专家分月排行榜第一2015年4月 Oracle大版内专家分月排行榜第一2015年3月 Oracle大版内专家分月排行榜第一2015年2月 Oracle大版内专家分月排行榜第一2014年6月 Oracle大版内专家分月排行榜第一2009年11月 Oracle大版内专家分月排行榜第一2009年10月 Oracle大版内专家分月排行榜第一
2015年9月 Oracle大版内专家分月排行榜第二2015年7月 Oracle大版内专家分月排行榜第二2015年1月 Oracle大版内专家分月排行榜第二2014年12月 Oracle大版内专家分月排行榜第二2014年11月 Oracle大版内专家分月排行榜第二2014年8月 Oracle大版内专家分月排行榜第二2014年7月 Oracle大版内专家分月排行榜第二2014年5月 Oracle大版内专家分月排行榜第二2010年1月 Oracle大版内专家分月排行榜第二2009年9月 Oracle大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。在Oracle 10g,Number、Char和Varchar2类型作为主键,查询效率分析
& 在实际项目中,设计表的主键生成机制有多种选择:Sequence、产品自增长、表自增长、UUID、复合主键。从主键单纯性和查询简单性考虑,首先不建议使用复合主键。从数据表重建和数据迁移的方便性考虑,首选UUID,但使用UUID就必须使用字符类型字段,有担心字符类型主键的查询效率远不及数字类型主键。另外,有观点指出,对Varchar2类型字段建立索引,查询时,不使用该索引。在网上搜索相关的文章后,没有可信证据,所以,自力更生,寻找验证方案。
& 建三张相同结构的表,分别使用Number、Char和Varchar2类型作为主键(Number类型主键值用Sequence的方式生成,Char和Varchar2类型主键值用GUID类生成),此次仅测试数据库的性能,所以,一切操作仅使用SQL和PLSQL完成。执行以下操作,并记录执行时间:
& 1 每张表录入100万条记录。
& 2 按主键排序,抽取第50万个记录的主键,执行主键查询。
--&Number类型主键
create table b2c_pk_number
& id number(15),
& name varchar2(32)
) tablespace ecsdata2;
alter table b2c_pk_number&
& add constraint pk_pk_number primary key (id)
& using index tablespace ecsindex2;
--&Char类型主键
create table b2c_pk_char
& id char(32),
& name varchar2(32)
) tablespace ecsdata2;
alter table b2c_pk_char&
& add constraint pk_pk_char primary key (id)
& using index tablespace ecsindex2;
--&Varchar2类型主键
create table b2c_pk_varchar2
& id varchar2(32),
& name varchar2(32)
) tablespace ecsdata2;
alter table b2c_pk_varchar2
& add constraint pk_pk_varchar2 primary key (id)
& using index tablespace ecsindex2;
插入100万条记录
--&Number类型主键
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& insert into b2c_pk_number(id,name) values(idx, sys_guid());
& -- 每1万提交一次
& if( mod(idx, 10000) = 0) then
& -- dbms_output.put_line(idx);
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
--&Char类型主键
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& insert into b2c_pk_char(id,name) values(sys_guid(), sys_guid());
& -- 每1万提交一次
& if( mod(idx, 10000) = 0) then
& -- dbms_output.put_line(idx);
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
--&Varchar2类型主键
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& insert into b2c_pk_varchar2(id,name) values(sys_guid(), sys_guid());
& -- 每1万提交一次
& if( mod(idx, 10000) = 0) then
& -- dbms_output.put_line(idx);
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
Number类型主键
Char类型主键
Varchar2类型主键
执行时间(单位:秒) 71. 93. 97.
& 考虑到,Number类型主键的新增记录少调用了一次sys_guid(),而且,在实际中,会用到Sequence。所以,做出以下调整:
1 创建Sequence
create sequence seq_pk_
2 将b2c_pk_number表清空
truncate table b2c_pk_
3 修改新增记录的plsql,重新执行。
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& insert into b2c_pk_number(id,name) values(seq_pk_number.nextval, sys_guid());
& -- 每1万提交一次
& if( mod(idx, 10000) = 0) then
& -- dbms_output.put_line(idx);
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
修正后结果
Number类型主键
Char类型主键
Varchar2类型主键
执行时间(单位:秒) 78. 93. 97.
对第50W条记录进行查询100W次的总时间
--&Number类型主键
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& execute immediate 'select * from b2c_pk_number where id = ;;
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
--&Char类型主键
select * from (select t.*, row_number() over(order by id) rn from b2c_pk_char t ) where rn = 500000;
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& execute immediate 'select * from&b2c_pk_char where id = ''D4FBEDB7D7''';
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
--&Varchar2类型主键
select * from (select t.*, row_number() over(order by id) rn from b2c_pk_varchar2 t ) where rn = 500000;
& v_total number := 1000000;
& v_starttime :=
& for idx in 1 .. v_total
& execute immediate 'select * from&b2c_pk_varchar2&where id = ''D4F1A8CC22BE55ADEDB7D7''';
& v_endtime :=
& dbms_output.put_line(v_endtime - v_starttime);
Number类型主键
Char类型主键
Varchar2类型主键
执行时间(单位:秒) 31. 24. 24.
insert into b2c_pk_number(id,name) values(:1, sys_guid());
INSERT STATEMENT, GOAL = ALL_ROWS& 1& 1& 100& 0& 1& ALL_ROWS& 1
insert into b2c_pk_char(id,name) values(sys_guid(), sys_guid());
INSERT STATEMENT, GOAL = ALL_ROWS& 1& 1& 100& 0& 1& ALL_ROWS& 1
insert into b2c_pk_varchar2(id,name) values(sys_guid(), sys_guid());
INSERT STATEMENT, GOAL = ALL_ROWS& 1& 1& 100& 0& 1& ALL_ROWS& 1
select * from b2c_pk_number where id = 500000;
SELECT STATEMENT, GOAL = ALL_ROWS& 1& 1& 31& 15463& 1& ALL_ROWS& 1
TABLE ACCESS BY INDEX ROWID& CCBPD& B2C_PK_NUMBER& 1& 1& 31& 1
& INDEX UNIQUE SCAN& CCBPD& PK_PK_NUMBER& 1& 1& 8171& &ID&=& 1
select * from b2c_pk_char where id = 'D4FBEDB7D7';
SELECT STATEMENT, GOAL = ALL_ROWS& 1& 1& 52& 15463& 1& ALL_ROWS& 1
TABLE ACCESS BY INDEX ROWID& CCBPD& B2C_PK_CHAR& 1& 1& 52& 1
& INDEX UNIQUE SCAN& CCBPD& PK_PK_CHAR& 1& 1& 8171& &ID&='D4FBEDB7D7'& 1& 1
select * from b2c_pk_varchar2 where id = 'D4F1A8CC22BE55ADEDB7D7';
SELECT STATEMENT, GOAL = ALL_ROWS& 1& 1& 36& 15463& 1& ALL_ROWS& 1
TABLE ACCESS BY INDEX ROWID& CCBPD& B2C_PK_VARCHAR2& 1& 1& 36& 1
& INDEX UNIQUE SCAN& CCBPD& PK_PK_VARCHAR2& 1& 1& 8171& &ID&='D4F1A8CC22BE55ADEDB7D7'& 1& 1
& 从以上结果看,新增记录Number类型主键的效率要比Char类型和Varchar2类型主键类型的效率要高,而查询则相反。当然,以上的分析仅从简单的新增和查询分析,还需要进行复杂测试来证明(复杂的查询,以及真实的应用程序环境)。

我要回帖

 

随机推荐