使用rowid来在线重定义表
网上已经有很多在线重定义表的例子,但是大多基于主键进行的,其实oracle也支持rowid的方式进行重定义,下面就简单举个例子. [@more@]SQL> create table demo_1 (id number);表已创建。SQL> insert into demo_1 values (1);已创建 1 行。SQL> insert into demo_1 values (2);已创建 1 行。SQL> insert into demo_1 values (2);已创建 1 行。SQL> insert into demo_1 values (3);已创建 1 行。SQL> insert into demo_1 values (3);已创建 1 行。SQL> commit;提交完成。SQL> execute dbms_redefinition.can_redef_tabl
sqlserver的update操作比oracle快得多
最近听朋友说sqlserver平台上update操作比oracle要快得多,于是做了下测试.测试机就是pc机,同时安装oracle9204和sqlserver2000,分别单独启动进行测试.对于100万行具有4个int类型的表,同时更新4个字段,sqlserver要37秒,oracle要164秒,差距很明显.经过查阅相关资料,知道sqlserver在update的时候居然是表级锁,就是说其它会话不能对该表进行update,会被阻塞,即使update的行和第一个会话update的行不一样也不行.即sqlserver是通过锁住整个表资源来达到update的高性能,牺牲了并行性,当有大量用户同时进行update时就会导致整个系统全部慢下来.而or
10g文档中的bug
今天看10g的文档Database Reference,在附录A Database Limits的Physical Database Limits中,发现有个地方写得不是很准确:Smallfile (traditional) Tablespaces Number of blocks (4 MB) blocks 意思是对于传统表空间,其最大尺寸是4M个数据块(block)这个说法是不准确的,应该说是传统表空间的中每个数据文件的最大尺寸是4M个数据块(block)举例如下(block=8k):[@more@]SQL> create tablespace demo datafile '/u01/oradata/oradb/demo01.dbf' size 25600M; Tablespace created.SQL> alter tablespace demo add datafile
64位系统下shmmax设置问题
系统配置:64位redhat linuxe as3 ,oracle9204,机器有8G内存以前在32位系统下,shmmax的含义是单个共享内存段的最大尺寸,比如你设置shmmax=1G,sga分配了1.2G,当启动db时就分配2块共享内存给oracle。可是最近在64位上测试,发现当设置shmmax <= 956301311时,sga的分配规律和32位上一样。但是如果设置shmmax > 956301311,则如果sga设置的值大于shmmax的值且大于2.3G时,启动数据报错:SQL> startupORA-27123: unable to attach to shared memory segment下面是个在64位上的测试结果:[@more@]shmmax值 SGA值 分配共享内存是
KEEP POOL和CACHE属性的区别
我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:[@more@]BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数:DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。语法如下:create/alter table ...... storage(buffer_pool keep); 当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,保留的时间长短依据keep pool的负载而定。create/alter table ...... cache; 当全表扫描时,放入
导入导出中支持表名模式匹配
这个特性是从9i开始支持的,格式如下:TABLES=(MYSCHEMA.ORDER%, MYSCHEMA.EMP%)可以将以模式MYSCHEMA下以ORDER、EMP开头的表导出或者导入,下面是个简单的验证过程[@more@][oracle@localhost oracle]$ sqlplus test/testSQL*Plus: Release 9.2.0.4.0 - Production on 星期三 4月 26 09:38:26 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.4.0 -
在64位的RHAS3上安装ORACLE9204
操作系统版本如下:[root@test gpodb]# cat /etc/redhat-release Red Hat Enterprise Linux AS release 3 (Taroon Update 5)[root@test gpodb]# uname -aLinux test 2.4.21-32.EL #1 SMP Fri Apr 15 21:02:58 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux安装结论:安装前不用打任何补丁包,直接安装9204的安装文件即可[@more@]
在高级复制环境中执行DDL处理步骤
在高级复制环境中的对于需要复制的对象作任何DDL操作,都应该使用高级复制程序包来实现,下面是在一个复制表上添加两个列的DDL操作的处理流程。[@more@]首先说明一下测试环境:oracle9204,单主体站点,只读物化视图在非复制环境中简单的添加列的语句:ALTER TABLE DEMO ADD (D2 NUMBER,D3 NUMBER);一、在主体站点上执行的步骤1、挂起复制组DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY(GNAME =>'REP_GROUP');2、通过高级复制包中的过程来执行DDLDBMS_REPCAT.ALTER_MASTER_REPOBJECT (SNAME =>'SCOTT',ONAME =>'DEMO',TYPE =>'TABLE'
关于Oracle9i中timestamp数据类型的一个bug
今天在网友blog上看到一片文章描述通过数据库链使用CTAS建表时,如果在源表中含有timestamp类型的列,则新创建的表的timestamp列的精度被置为最小即timestamp(0)Bug 2417643,该bug在10g中已经被修正过来,下面是我在9204中的测试验证 [@more@]1、在数据库A中创建源表SQL> create table demo (d1 timestamp(6));Table createdSQL> desc demoName Type Nullable Default Comments ---- ------------ -------- ------- -------- D1 TIMESTAMP(6) Y SQL> insert into demo(d1) values (timestamp'2005-04-17 14:12:03.234');1 row i
定制作业以半小时为单位执行
即要以30分钟为单位取整执行,有以下两种方法:-- 简单起见,只写取下一次时间的算法方法一:SQL> select trunc(sysdate,'HH24')+(trunc(sysdate+1/48,'HH24')-trunc(sysdate,'HH24'))/2+1/48 from dual;TRUNC(SYSDATE,'HH24')+(TRUNC(S------------------------------2006-4-12 15:30:00 方法二:QL> select trunc(sysdate,'HH24')+CASE WHEN TO_CHAR(SYSDATE,'MI')>=30 THEN 1/24 ELSE 1/48 END from dual;TRUNC(SYSDATE,'HH24')+CASEWHEN------------------------------2006-4-12 15:30:00 [@more@]
使用自定义聚集函数来实现分组合并字符串
oracle自定义聚集函数接口简介 a. static function ODCIAggregateInitialize(sctx IN OUTstring_agg_type ) return number 自定义聚集函数初始化设置,从这儿开始一个聚集函数 b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2) return number 自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联 c. member functio
oracle10g中的bigfile tablespace
bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1个最大4G个blocks 的datafile。因此,使用8KBdata blocks 的bigfile tablespace 最大可以达到32TB。Bigfile tablespaces 常用于非常大的DB。 如果很大的DB有成千的 read/write datafiles, 那么checkpoints之类的操作将非常费时。如果用一个很大的datafile,减少datafiles的数量,将会提高效率。创建时使用BIGFILE关键字如下:CREATE BIGFILE TABLESPACE BIG_DEMODATAFILE '/ORADATA/PROD/BIG_DEMO.DBF' SIZE 25G;Smallfile tablespace是原Oracle tablespace datafile 选项
语法novalidate对添加主键约束不起作用
最近在看tom的《Effective Oracle by design》,其中第6章6.3.8节有个例子是给表添加主键,但是不想对已经存在的数据进行校验:alter table dept add constraint dept_pk primary key(deptno) rely enable novalidate;我经过测试,发现即使加上novalidate语法也还是要检验的,测试如下:[@more@]SQL> create table aaa as select * from all_users;Table createdSQL> insert into aaa select * from aaa;29 rows insertedSQL> alter table aaa add constraint pk_aaa primary key(username) rely enable novalidate;alter table
批量绑定与本地动态SQL execute immediate的结合
批量处理不仅可以和静态sql组合,也可以和动态sql结合使用,但是在8i和9i中,其具体处理方式有些差异 [@more@]1> 在8i环境下create table aaa (a1 number);create type vcarray as table of number; create or replace procedure p_demo isp_value vcarray := vcarray(); beginfor i in 1..10000loop p_value.extend;p_value(i) := i;end loop;execute immediate'beginforall j in 1..10000insert into aaa values (:x(j));end;'using p_value;commit;end p_demo;注意:1、使用数组类型要先初始化p_value vcarray := vcarray()2、不要在
关于exists、in系列的补充说明
1、在Oracle8i中,当使用exists时,如果两表连接字段使用函数或||之类的特殊处理,其执行计划不能走hash semi的半连接,这时需要将其改成in的格式来处理,9i中就不存在这种情况 [@more@]Oracle 8i 中:select count(*)from t_cp_dz_user twhere t.strdatetime > '0602'and exists(select /*+ hash_sj(t q)*/* from t_200602_yd_3 qwhere q.mpn=substr(t.strusernumber,3) )执行计划:SELECT STATEMENT, GOAL = CHOOSE SORT AGGREGATE FILTER TABLE ACCESS FULL Object owner=SMSTABLE ACCESS FULL Object owner=SMS select count(*)fro
使用vnc访问linux
这两天公司网络重新配置了,我的pc的ip也换了,结果平时用来统计数据的linux服务器不能用xmanager连上,能ping通,ssh也能访问,估计是交换机设置有问题。但又急着用图形界面,于是换用vnc来访问。配置很简单,网上到处都有资料,这里就不重复了。感觉使用vnc,客户端可以使用浏览器就能访问,这是最方便的一点,缺点是图形比较差,这点就不如xmanager了[@more@]