Oracle中字段长度分为两种:一种是字节(BYTE)长度,另一种是字符(CHARACTER)长度。 比如在一个字段里存储这样两个字符:一个汉字和一个英文字母。用字节长度来计算的话,那就是3 bytes;如果用字符长度来计算的话,那就是2 characters。设想一个自助新闻发布系统,假如用varchar2来存储正文并且需要限制正文长度,该怎么做?直接用varchar2 (2000)么?事实上这样的话我们可能会发现,正文长度会被限制在1000或者更少的字符数。这是由于各种文字的编码长度不同所致,有的是单字节,有的 是双字节,有的可能是三个字节。程序员很可能得自己写个函数来控制字符数。 事实上,Oracle可以很方便的达到你的目的。先看一个简单的实验: SQL> create table zeeno (text varchar2(10 char)); Table created. SQL> insert into zeeno values(‘hi,对我喊万岁’); 1 row created. 再使用BYTE看看: SQL> create table zeeno (text varchar2(10 byte)); Table created. SQL> insert into zeeno values(‘hi,对我喊万岁’); insert into zeeno values(‘hi,对我喊万岁’) * ERROR at line 1: ORA-12899: value too large for column “SYS”.”ZEENO”.”TEXT” [...]
Archives for August 2006
Oracle相关开源软件
如果有差强人意(不要求最好)的开源软件,那么我更愿意放弃使用商业软件。不过在整体上看,Windows下的高水准开源软件确实不多。 有人列了个跟Oracle开发相关的开源软件清单。在这个清单中我只用过三个:TOra,DIA和hammerora。 Hammerora是很久以前在Fenng的blog上看到过,据说是一款非常优秀的压力生成工具,可惜我不懂Tcl/Tk,装上尝个新鲜就卸了。 TOra还留着,不过用得更多的是Oracle亲生的SQL Developer。 DIA严格意义上来说跟Oracle关系不大,是Linux下常用的绘(流程)图工具。不过我现在Linux下不怎么用GUI了。 OraSchemaDoc: A JavaDoc like documenter for Oracle databases. Very handy if you use table and object comments. It also shows dependencies. TOra: It’s so close that TOra has been taken over by quest and incorporated into TOAD. MOD_PLSQL: An apache add-on for accessing PLSQL stored procedures from the web. [...]
FORCE LOGGING
通常情况下,任何DML(如INSERT, DELETE)都会生产redo log,如果使用NOLOGGING的话会大大加快执行速度。 ZEENO@SS01PRD> create table zeeno as 2 select * from cust_mon_sales 3 where 1=2; Table created. 这样一来,你在zeeno表中的任何DDL都不会产生redo log。在一些临时的操作中这非常有用。 但对于更多的实际应用而言,你必须保证数据的可恢复,任何在产品数据库中取消redo log以提到执行效率的做法都是值得商榷的,也是绝对需要慎重考虑的。因而,有时候我们需要保证在产品数据库中(或者其他的一些有必要的场合)的任何 DML都必须产生redo log,这可以通过一些强制措施来实现。 ALTER DATABASE FORCE LOGGING; 在数据库级别应用FORCE LOGGING可以强制该数据库中的任何DML都产生redo log,用户无法取消这个特性。也可以在tablespace级别应用FORCE LOGGING,但是建议不要在database和tablespace级别上同时应用FORCE LOGGING模式。 撤销该模式: ZEENO@SS01PRD> alter database no force logging; Database altered. FORCE LOGGING模式会成为database的永久属性,重新后并不会改变该属性,但是如果重建了control file,数据库将不会被置于FORCE LOGGING模式,除非在创建控制文件的时候指定了FORCE LOGGING。 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – [...]
Partition的选择
Oramag上的这篇文章介绍了不同的分区方法(range, list, hash等)及其适用环境,非常简单易懂。 作者同时也介绍了在数据仓库环境如何更高效的维护数据(重建索引,移动,丢弃等)。比如,用下面的方法移动整个partition,实在是方便: alter table trans_summary exchange partition p1 with table trans_summary_temp including indexes; 我对数据仓库的了解不多,不过partition对于维护千万条记录的历史数据还是很有帮助的。
简单方式重现ORA-03113
Fenng曾经总结过ORA-03113的各类原因: Unix核心参数设置不当 Oracle执行文件权限不正确/环境变量问题 客户端通信不能正确处理 数据库服务器崩溃/操作系统崩溃/进程被kill Oracle 内部错误 特定SQL、PL/SQL引起的错误 空间不够 防火墙的问题 可是有一种原因也能引起这个问题,这绝对是多数人意想不到的。 SQL> conn sys/manager as sysdba Connected to an idle instance.SQL> startup ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1247876 bytes Variable Size 62915964 bytes Database Buffers 96468992 bytes Redo Buffers 7139328 bytes Database mounted. Database opened. 然后在操作系统中执行这个命令: REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE [...]