Oracle Archives
May 11, 2008
来杭两周多一点, 扣去入职培训一周, 接触系统仅一周多一点的时间, 已经遇到了两个数据库方面的Bug了. 第一个是在10.2.0.2版本上遇到的, 和Oracle CBO优化器有关的, 在某些用了INDEX这个HINT的数据库中, Oracle居然选择了INDEX FULL SCAN的方法, 而不是效率更高的INDEX RANGE SCAN, 由于表及索引较大, 导致了SQL语句执成本过高, 引起了主机负荷超常. 4323868...
April 2, 2008
Log Miner恢复的误区
今天一个网友在用Log Miner恢复时, 发现怎么都恢复不了想要的DML语句, 所有步骤都是正确无误的. execute dbms_logmnr.add_logfile(options =>dbms_logmnr.new,logfilename => ... execute dbms_logmnr.add_logfile(options =>dbms_logmnr.addfile,logfilename =>... EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'.....'); SELECT sql_undo,sql_redo FROM...
February 28, 2008
Oracle CBO认为Cost为0
在一个分区表上去执行一个SQL时(在Where条件中用了分区列等于的条件, 分区列为主键索引的最后一列), 发现用错了执行计划, Oracle居然认为某个SQL的执行计划的成本为0, 实际上是肯定没有本为0的执行计划的, 因此是明显的不合理的现象. SQLPLAN COST CARD KBYTE PS PE ------------------------------------------------ ---- ---- ----- -- -- 0 ...
January 17, 2008
不能删除物化视图?
几分钟前一网友问我如何删除一个实体化视图, 当然不是什么语法不会的问题了, 是发了Drop命令后一直挂着, 几个小时都没有结束, 你可以想想为什么? 先看一下创建的语法. create materialized view user_order_mavi build immediate refresh on commit enable...
January 9, 2008
Oracle RAC VIP不能启动2
由于VMWare GSX Server和Windows XP sp2的不兼容, 就安装了VMware Server版本, 却发现安装的Oracle RAC不能好好工作了, 最大的原因是, VIP服务不能自动启动了, 怎么找也找不出原因. 用oifcfg命令看RAC的网卡设置, 没有发现问题. [root@db01 /]#...
January 3, 2008
Oracle RAC VIP的依赖
Oracle 10G RAC中多了一个VIP资源, 也许应当叫服务, 如下所示, 其中db01, db02, db03都是RAC节点的名称. [root@db02 oracle]# crs_stat | grep vip NAME=ora.db01.vip NAME=ora.db02.vip NAME=ora.db03.vip ...
January 1, 2008
手工添加Oracle RAC监听
在Oracle 10g CRS中没有直接添加Listener的命令, 但可以创建一些配置文件, 然后注册这些文件来向CRS中添加临听器. 首先在每台机器中配置临听器, 手工创建listener.ora文件, 包括所有节点的监听器, 这里面的node名称用大写. SID_LIST_LISTENER_<node>= LISTENER_<node>= 接下来要创建配置文件, 有几个节点就要创建几个文件, 第一个node用小写的, 后面的用大写. ${ORA_CRS_HOME}/crs/public/ora.<node>.LISTENER_<node>.lsnr.cap...
December 31, 2007
Oracle RAC VIP不能启动?
在笔记本上完成三个节点的Oracle RAC安装已经好几天了, 先是在一个节点上用图形界面安装的, 另外两个是装了OS后, 用rsync将CRS和DB软件拷贝过去, 然后在命令行下完成所有设置的. 虽然RAC服务是可以起来了, 数据库也可以在三个节点打开, 但是一些外围服务去一直没有跑起来, 包括vip. 晚上先是在google上搜索了一下, 发现好象遇到了一个bug, 我的hosts和ocr中设置的机器名都是小写的, 而hostname命令输出的则是大写的, 导致了vip不能自动启动. 通过更改/etc/sysconfig/network文件,...
December 29, 2007
Linux OCFS2安装及配置
OCFS2是一款廉价的Cluster文件系统(Cluster File System), 由Oracle领导开源方式开发的, 可以到Oracle OSS网站上免费下载现成的或源代码进行编译. 要下载两个包, 需要注意和Linux内核的版本匹配总题, 如果下载源码自行编译则另说. rpm -i ocfs2-2.6.9-55.ELsmp-1.2.7-1.el4.i686.rpm \ ocfs2-tools-1.2.7-1.el4.i386.rpm 安装后,...
Linux Oracle RAC内核参数
在Oracle RAC/DB的安装过程中, 会要求调一些Linux内核参数, 如下所示. # For Oracle 10g RAC kernel.sem=250 32000 100 128 kernel.shmmax=1048576000 kernel.shmmni=4096 kernel.shmall=2097152 fs.file-max=65536 net.core.rmem_default=262144 net.core.rmem_max=262144...
December 28, 2007
Mini VMWare Oracle RAC
创建第一个RAC节点时, 分了一个4GB的盘, Linux已经是选择最小安装了, 然后自已手工安装的gcc开发包及基本X-Windows系统, 能运行xterm就行. 后来搞了一个更小的3G, 分区设置如下: /boot : 64MB swap : 384MB / : 2578MB 手工安装开发包的命令如下,...
December 18, 2007
MVIEW引起ORA-04031
有一个数据库报了ORA-04031错误, 等我们上去看时, 却是好的, 通过查询Statspack有关视图, 发现Shared Pool Free Memory在这之前是逐渐减少的, sql area部分占得很大. 可能的原因是, 当Oracle遇到这个错误后, 自动做了一次Flush Pool操作. 于是写了一段程序去跟踪SQL占用的内存, 发现有两个SQL语句很不正常, 版本数很多, 占用的内存也很大,...
December 4, 2007
TIMESTAMP类型上的索引
Oracle在进行值的大小比较时, 不是我们人脑所想象的那种值比较, 而是将这些值的物理存贮进行字典式的字节比较. 我们来看一下数值1和2的物理存贮. SQL> SELECT DUMP(1) FROM DUAL; Typ=2 Len=2: 193,2 SQL> SELECT DUMP(2) FROM DUAL; Typ=2...
November 28, 2007
如何提高Oracle exp/imp的速度?
在用Oracle的exp/imp工具时, 常常有人嫌它忙, 这个两个工具是比较慢, 除了用比较大的buffer参数外, 还是有办法可以加快的. 在exp时, 可以考虑更改表的并行度(ALTER TABLE xxx PARALLEL 4), 或者更改exp进程的Multiple Block Read参数的值. SELECT SID, SERIAL# FROM...
October 9, 2007
Oracle csscan工具的工作原理
再来回顾一下上一篇中的两条样本数据. SQL> col col2 format a40 SQL> select col1, dump(col2) col2 from t_charset; COL1 COL2 ---------- ---------------------------------------- ZHS16GBK ...
October 8, 2007
Oracle的字符集转换的一个小测试
对于Oracle的字符集, 一直不是很明白的, 除了在出道的当年(98年)范过一次这方面的错后, 到还没有第二次, 算是走运了. 下面来做一个小实验, 加深一下理解, 我测试用的数据库端是UTF8格式的, 测试用的表结构如下, 第一个字段用于记录NLS_LANG的设置, 第二列则为相同的值. create table t_charset(col1 varchar2(10), col2 varchar2(20)); ...
September 6, 2007
用Stop List来缩小Oracle全文索引的大小
Oracle的全文索引是一个很好的搜索解决方案, 不过随着要搜索的内容的增加, 会发现全文搜索的索引会耗掉很多的空间, 也在一定的程度上影响了全文索引的查询速度. 我们可以用如下方法去看, Oracle是如何划分单词的, 如在CR_CTXDEMO表的COL2列上面建一了个CTXSYS.CONTENT类型的全文索引, 则可以用如下SQL语句去查询: SELECT TOKEN_TEXT, COUNT(*) FROM DR$IDX_CR_CTXDEMO_COL2$I WHERE ROWNUM <...
September 4, 2007
Oracle 11g新特性 -- DG压缩传送日志
用DataGuard做远距离的容灾时, 日志的传送也会成关键的问题. 面对这个问题, 首先会想到将Archive Log先缩压一下, 再进行传送, 或者用rsync(现在用得越来越广了)加上压缩选项来处理, 可以说Oracle的这个功能来得太晚了, 应当在9i时就加上. 通过LOG_ARCHIVE_DEST_n中的一个参数可以控制是否启用压缩功能, 默认值是禁用的. 如下所示: LOG_ARCHIVE_DEST_n='SERVICE=... COMPRESSION={ENABLE|DISABLE}' ...
August 22, 2007
ORA-01102: 不能加载数据库到EXCLUSIVE模式
在本地建Standby时会遇到下面这个错误. 有几个库是从同一个源库拷贝出来, 今天在为他们在同一台机器上建Standby也遇到了这个问题, 这几个库拷出来后就没有改更过DB_NAME, 因此他们都是相同的, 只是实例名不同而已. SQL> alter database mount standby database; alter database mount standby database *...
August 21, 2007
如何获得X$表上的特殊索引信息?
充分利用X$表上的特殊索引, 可以加快对性能视图的访问速度, 从而编译高效的性能监控程序. Oracle提供了一个视图可以用来查询在X$表的那些列上有这样的索引存在, 如下所示: SQL> DESC V$INDEXED_FIXED_COLUMN Name Null? Type -------------------- -------- ------------- TABLE_NAME VARCHAR2(30) INDEX_NUMBER NUMBER COLUMN_NAME VARCHAR2(30) COLUMN_POSITION ...
August 12, 2007
USE_CONCAT对X$表有时并不工作
上一次发现访问X$KSLEI时, 用这个Hint很有效, 后来在更多的机器上测试, 发现有的数据库上这个Hint并不工作, 如下所示: SQL> SELECT /*+ USE_CONCAT */ * FROM X$KSLEI WHERE INDX IN (1,2); ----------------------------------------------------...
August 7, 2007
10g中不同Oracle优化器版本的参数差异
NAME8.1.79.2.010.2.0.1 _trace_optionstextmultipletext _db_block_adjchk_level785615367888921678889216 _always_semi_joinOFFCHOOSECHOOSE _ordered_nested_loopFALSETRUETRUE _optimizer_max_permutations8000020002000 query_rewrite_enabledFALSEFALSETRUE _mmv_query_rewrite_enabledFALSEFALSETRUE _index_join_enabledFALSETRUETRUE _table_scan_cost_plus_oneFALSETRUETRUE _cost_equality_semi_joinFALSETRUETRUE _new_initial_join_ordersFALSETRUETRUE _optim_peek_user_bindsFALSETRUETRUE _gs_anti_semi_join_allowedFALSETRUETRUE _optim_new_default_join_selFALSETRUETRUE optimizer_dynamic_sampling012 _pre_rewrite_push_predFALSETRUETRUE _union_rewrite_for_gsOFFYES_GSET_MVSYES_GSET_MVS _generalized_pruning_enabledFALSETRUETRUE...
August 6, 2007
FOR UPDATE SKIP LOCKED语句中的逻辑读
今天发现这样的一个语句逻辑读很高, 在Physical Standby上打开查询, 发现逻辑读是很低的, 只有源库的百分之一, 百思不得其解. 回来后建了如下表做测试: SQL> CREATE TABLE T_SKIPLOCKED 2 ( 3 NO NUMBER(2), 4 COL2 CHAR(200),...
August 3, 2007
LOG_ARCHIVE_FORMAT中%r值从哪儿来的?
当数据库从9i或8i升级到10g时, 如果compatible参数也设成了10以上, 则LOG_ARCHIVE_FORMAT参数中必须包含%s, %t, %r参数. 其中%s是Log Seuqence; %t是Thread ID, RAC的节点中设有THREAD参数, 就是这个值了; %r指的是Resetlog ID了, 比较新, 得从Oracle 10g中增加的跨Resetlogs恢复功能说起. ...
August 2, 2007
如何以较好的性能访问Oracle内核表?
Oracle通常在一些内核表的INDX列有特殊的索引, 如果能用到这些索引, 则访问很快, 否则在会话数很多的数据库上很慢. 最简单的访问就是用等于去访问. SQL> SELECT INDX, KSLESWTS,KSLESTIM FROM X$KSLEI WHERE INDX=1; INDX KSLESWTS KSLESTIM ---------- ----------...
July 13, 2007
Oracle 11g性能提升 -- 其他地方
看白皮书上这么多的功能, 如果在11g中能很成熟, 那真是一个变化比较大的改进, 来看一下关于性能方面的其他改进吧. 1, RAC节点通信协议的改进. 11g中的协议比较智能, 可以根据节点的负荷作出动态的调整, 大大减少节点之间的消息传递量. 说老实话不知道是如何工作的. 2, 边恢复边Open的Physical...
July 12, 2007
Oracle 11g性能提升 -- Server Connection Pool
在应用服务器这一层, 我们已经使用Connection Pool了, 可以有效地降低服务器上的连接的数量, 不过还是有不足之处的. 当你的访问量达到一定的规模时, 你会发现一台或几台应用服务器根本就解决不了问题, 在有些世界级的网站中, 应用服务器的数量可能是上千台的, 当每个应用服务器产生4-5个连接时, 你会发现Oracle服务器端便有了4-5千个物理连接. 象PHP程序, 要求每一个Web Server进程都至少有一个连接. 因此Oracle在11g中引入了Database Resident Connection Pool的功能,...
Oracle 11g性能提升 -- Consistent Client Cache
10g几乎没有关心, 现在都现11g了, 得关心一下了, 要不然就落伍了. Cache始终是提升性能的重要技术. 除了在前面讲的Server Result Cache, Oracle 11g还增加了一种Client Cache. 第一眼看到时, 我猜测可能和在程序中用数组保存一些查找表差不多, 不过仔看白皮书, 还是要比自已写程序来得方便许多. 这是一种在Oracle...
Oracle 11g性能提升 -- Server Result Cache
10g几乎没有关心, 现在都现11g了, 得关心一下了, 要不然就落伍了. Cache始终是提升性能的重要技术, 在Oracle 11g中增加了一种Server Result Cache, 第一眼看到这个名字, 我觉得和MySQL的Query Cache是差不多的技术, 不过仔看白皮书, 还是要比MySQL进步多了. 谁可以共享这些数据? MySQL的Query...
April 28, 2007
对Hash Cluster表的一些进一步测试之二
今天早上用真实的数据进行了第二次测试, 一是验证我这种定义SIZE和HASHKEYS参数的方法有没有问题, 另外一个是难证Oracle自带的Hash函数是否高效. 为此我选取了1000万条真实的记录, 表的大小大约是1.5个G, 我将Cluster的HASHKEYS * SIZE设成2G左右, 语句如下: CREATE CLUSTER C_USER_HOST_ID_LOOKUP (USER_ID NUMBER(38,0)) SIZE 8192 SINGLE TABLE...
April 27, 2007
对Hash Cluster表的一些进一步测试之一
在前面的例子中, 我们都只是做了一些小批量数据, 如果我的Hash Cluster表有几个GB或几十个GB的大小时, 又怎么样呢? 下面进行的是我在笔记本上的测试, 用于测试的表的大小是100MB, 进行测试时的数据是50万条. 测试的目的是为了要证明Hash Cluster是否可能用于大数据量的表中, 即验证Oracle内建的Hash函数是否是高效的. 创建Hash Cluster的句语是: CREATE CLUSTER C_T_OBJECTS (OBJECT_ID NUMBER(38,0))...
Oracle应当增加一种基于Hash算法的索引
Hash是非常高效的一种查找算法, Oracle中的Hash Join更是声名远播, 还有Hash Cluster表, 可以获得很好的性能. 现在的B*Tree结构的索引, 虽然很好, 但在很繁忙的系统中, 还是有一些不足, 比较典型的是在索引的根结点上, 发生Split时很容易引起数据库的问题. 另外从Root块到Branch块, 再到Leaf块, 最后到获得表的记录, 需要访问比较多的结点. ...
April 24, 2007
如何创建Single Hash Cluster的表?
Hash Cluster的表可以在没有索引的情况下, 获得对表的极快访问, 这种访问的逻辑读比维一性索引还有效. 在这儿有一张表T_OBJECTS, 其中的OBJECT_ID是主键, 大量的SQL语句都是根据OBJECT_ID去访问其他字段, 通过索引的情况下每次执行的逻辑读已经只有3了(Index Root->Leaf->Table), 但是就是这样一句简单的SQL的逻辑读占据了大半. 因此考虑到使用Single Hash Cluster表来进行调优. 应当如何来创建这个Cluster呢? 决定Cluster性能的主要有两个因素: SIZE和HASHKEYS. ...
March 30, 2007
在Hash表上建普通的B*Tree索引
最近几个人都写Blog来关注Single Table Cluster, 我也来重复一下, 要说明的是可以在Hash表上加普通的索引, 以支持按范围的访问, 演示的角本如下: CREATE CLUSTER HASH_C_DEMO (OBJECT_ID NUMBER) SIZE 50 SINGLE TABLE HASHKEYS 1000;...
March 28, 2007
Oracle Kernel Level的触发器效率很高吗?
下面的测试是基于Kernel Internal Trigger的实体化视图日志(Primary Key+Sequence): SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 10001; 9424 rows...
Oracle 10g中Procedure的Last DDL Time
早上以为发现了一个10g的Bug, 大家看一下, 我重建过程P_DEMO后, 它的Last DDL Time没有变化: SQL> SELECT OBJECT_NAME, LAST_DDL_TIME FROM USER_OBJECTS 2 WHERE OBJECT_NAME='P_DEMO'; OBJECT_NAME LAST_DDL_TIME -------------------- ------------------- P_DEMO ...
March 22, 2007
过长的In List引起的共享池内存问题
开发人员经常想用一个长长的In List来作为Where条件, 但这样的语句如果查执行计划不对的话, 很容易造成共享池(Shared Pool)内存问题, 下面是一个拥有40个值的In List的测试. 占用的内存如下所示: SQL> SELECT HASH_VALUE,SHARABLE_MEM,PERSISTENT_MEM,RUNTIME_MEM 2 FROM V$SQL WHERE HASH_VALUE IN (1981294536 ,3511787793);...
发生在Online Redefination上的一点小故事
使用Online Redefination技术可极少停机时间, 不过也发生过一些小故事. 首先来看一下表能不能支持联机重定义: SQL> exec dbms_redefinition.can_redef_table( USER, 'T_DEF1') ; PL/SQL procedure successfully completed. 接下来正式开始进行联机重定义: SQL> exec...
March 12, 2007
从Oracle向MySQL或其他库的数据复制方法
最近花了几天时间更深入地研究了一上实体化视图(Materialized View), 接下来就要利用研究的所得去练习一下了, 想做什么呢? 利用实体化视图日志(Materialized View Log)来跟踪Oracle数据库中表的变化, 然后写Perl程序去将变化过的数据刷新到MySQL数据库中, 充分防照实体化视图增量刷新(Fast Refresh)的原理, 可以高效地实现这一功能, 足以应对一般的业务需求了. 下面强调最主要的几点: 1, 每一个表必需要有主键. 2, 用With Primary...
March 9, 2007
Oracle的实体化视图(MVIEW)的深入研究之四
现在对第一篇中基表进行移动(Move)操作, 会发现不能进行快速刷新, 必须进行全部(Complete)刷新才行. 如下所示: SQL> ALTER TABLE T_MVLOG MOVE; Table altered. SQL> EXEC DBMS_MVIEW.REFRESH('MV_T_MVLOG','FAST'); BEGIN DBMS_MVIEW.REFRESH('MV_T_MVLOG','FAST'); END; *...
Oracle的实体化视图(MVIEW)的深入研究之三
在Oracle中创建视图时, 如果我们用了"*"符号, 会被自动地根据当时表的定义扩展成字段列表, 在后面再加列时, 新的列不会自动出现在视图的定义中, 直到你重建视图为止. 那么在MVIEW中呢, 通过一个不经意的操作, 发现一个有趣的问题. 总之, 不要随便地在实体视图的定义中使用"*"号. 下面我们在一个表上建两个实体化视图, 角本如下: CREATE TABLE T_MVTEST...
March 8, 2007
一种特殊的Library Cache Lock情况
在Oracle 10g中的我用两个会话, 搞出了下面这个等待情况, 很是有趣, 也很危险. SQL> SELECT SID, EVENT FROM V$SESSION 2 WHERE USERNAME='ANYSQL'; SID EVENT ---------- -------------------------------------...
Oracle的实体化视图(MVIEW)的深入研究之二
当在一个表上建了物化视图的日志(Materialized View Log)后, 所有的DML操作都会被相应地记录到物化视图日志表(MLOG$_)中, 如果想对这个表进行操作, 但不想这些操作被记录到日志(MVIEW LOG)中, 应当怎么办呢? 在DBMS_MVIEW包中有两个过程可以用来完成这个要求. 这里我们需要打开两个会话, 其中一个会话以DBA的身份登陆(Session DBA), 另一个会话随便了(Session USER), 按如下次序来进行操作: 在Session...
Oracle的实体化视图(MVIEW)的深入研究之一
从Oracle 8i开始提供了实体化视图, 能过预先计算好的中间表来提高应用的访问速度, 在特定的情况下是很有用的一项技术. 另外实体化视图还可用于数据复制, 在这个上面的应用越来越多. MVIEW中经常跗以遇到刷新很慢的情况, 如何提高呢? 首先来研究一下刷新的过程. 下面是用来创建演示表的角本: CREATE TABLE T_MVLOG (COL1 VARCHAR2(20)); CREATE MATERIALIZED VIEW...
March 7, 2007
Enable/Disable行内存贮的LOB字段性能分析
定义LOB字段时可以加上ENABLE/DISABLE STORAGE IN ROW的存贮属性, 默认情况下是ENABLE STORAGE IN ROW的, 这种情况除了在值小于4000字节时会将值直接存在行内以提高性能外, 对于再大一点的LOB值的存取也是有性能影响的, 请看下面的在10g版本中做的测试例子, 先建一个表, 包括两个CLOB字段, 并插入一样一样的大于4000字节的值. SQL> create table t_lobtest...
March 5, 2007
在Solaris上运行relink all时Oracle(9207)出错
最近在Solaris上安装Oracle 9.2.0.7, 却发现运行"relink all"时报了如下错误, 这已经第二次发现有关libsrvm.so的链接错误了. 只要不是运行"relink all"则都不会出错, 如"relink oracle"或"relink client_sharelib"等. 具体错误信息如下: ld: fatal: file ${ORACLE_HOME}/lib/libskgxn9.so: wrong ELF class:...
March 1, 2007
如何定义Oracle外部表中的DATE类型字段?
Oracle的外部表是一个很不错的功能, 可以轻松地将一个格式化的文本文件虚拟成数据库的表, 并可以用SELECT语句去访问, 正在被越来越多的人使用. 早上有人问我如何在外部表中定义一个日期类型的列, 我问他知不知道SQLLDR如何装载日期字段, 他说是知道的, 可他就是没有将这个日期在外部表上搞出来. 还是我做一个演示吧! 先建一个目录对象: SQL> conn / as sysdba Connected....
February 28, 2007
在Oracle中如何跳过被别人锁住的记录?
Oracle的AQ可用于消息处理, 可有一个或几个消息产生者将不同的消息插入到AQ表中, 然后由多个进程来获取并处理这些消息, 虽然这儿的解释很简单, 但要实现一个可靠具有事务功能的消息处理系统还是件不容易的事情. 在这儿我要讲的是当有多个消息处理进程时, Oracle是如何让他们能最快地并行地处理的? 这个问题可以简化为, 在一个表中有很多的记录(消息), 然后有很多进程来将这个表中的记录取出来, 进行处理后, 并在这个表中删除已经处理过的记录, 如果只有一两个这样的进程时, 可能什么事情也看不出来, 但是当有很多同样的进程来并行地处理这些记录时, 就会遇到数据库中常会遇到的Enqueue等待....
February 27, 2007
哪些参数在10g中可以系统级态动修改了?
从8i到9i再到10g, Oracle总是让更多的参数可以动态修改, 以减少停机的时间, 这是很有必要的. 通过比对9i和10g的参数列表, 我列出了下面一些认为比较常见的参数, 以供参考: 和内存有关的参数: sga_target java_pool_size 和SQL优化器(Optimizer)有关的参数: cpu_count optimizer_index_caching optimizer_index_cost_adj...
February 26, 2007
PL/SQL中如何进行批量删除(Bulk Delete)?
在Pro*C中可以为SQL中的绑定变量传入一个数组, 进行批量处理, 减少User Call和Execute Count, 尤其是在客户端服务器的情况下, 这个性能提升十份明显. 在Java中也有类似的executeBatch调用, 最新版本的Perl中也可以用数组来绑定一个变量. Oracle在9i的PL/SQL中正式支持了批量操作, 下面是一个批量删除的例子: DECLARE TYPE ARRROWID IS TABLE OF ROWID...
February 9, 2007
为Primary Key约束指定使用现有索引
几天前接到一个任务在现在的表上建一个索引, 发现这个表的现在有一个主键索引是建在(A,B)这两列上的, 而要建的索引是在(A,B,C)列上的, 主要目标是要让一个执行频率比较高的SQL不去访问表, 以减少逻辑读, 提升性能. 这时你会如何去考虑? 实际在增加约束时是可以指定约束使用那个索引的, 这个主键可以使用新建的这个三个列的索引, 从儿可以删除掉原来的建在两个列上的索引, 以节约空间. 看如下的演示: SQL> CREATE TABLE T_OBJECTS...
February 6, 2007
Oracle 11g中有INDEX_COL这个Hint吗?
当我们进行索引的联机维护(重命名, 改结构, 或删除)时, 会让现有的SQL走了错误的路径, 因为在现有的索引的HINT中一般都直接指明了索引的确切名字, 为了让SQL走新的索引, 你可能不得不去更改SQL中的HINT, 或用Outline来实现, 这样其实并不方便. 另外对于开发人员来说, 他们或许不知道那个索引更好, 但他们一般知道这个表上那个列的可选择性(Selectivity)好一些. 如果有方法能让Oracle的优化器选择某些列或以某些列前导的索引, 对DBA及开发人员都将十分有利. 一年多以前我就想让Oracle加一个INDEX_COL的HINT, 在用时我们只需要指定"index_col(表名, 列, ...)"就行了....
February 5, 2007
RMAN Copy加上Rsync, 在Oracle 11g中实现了吗?
去年有一段时间经常要为很忙的系统重建Standby, 因为归档生成量很多, 而存放归档日志的卷空间却不是很多, 给重建Standby带来很大的难处. 将表空间置为Begin Backup状态后, 生成的归档日志量更是加倍, 因此我们不得不用RMAN的Copy功能来进行数据文件拷贝, 但是没有办法直接拷贝到远程的机器上, 而用RMAN的Copy功能来拷贝文件的话则日志量不会增大, 但必须先拷到本地, 然后拷贝过去. 为什么不用NFS, 在不同的Data Center之间, 做NFS不是很简单的事, 在我们这儿, DBA只做DBA的事情....
January 31, 2007
你用过Oracle的Global Partition Index吗?
Oracle的分区表也不是十分好用, 当分区的数目比较多时, 很可能让一些不能进行Partition Prune的SQL拥有很高的逻辑读(Consistent Gets), 解决的办法是将一些索引建成全局索引. 现在我们来看一下相反的例子, Oracle中的表是不分区的, 而且访问量最多的SQL是根据一个选择性很好的索引去走的, 每次执行的逻辑读也就只有4-6个了, 因为访问量很高, 如果能降底一个逻辑读的话, 也可能降底整个系统5%-10%的逻辑读, 我们应当从哪儿来考虑呢? 索引的层次(Level)绝对是一个值得研究的角度. 事实上如果我们能让索引的层次(Level)高度降一级, 就可以降低一个逻辑读了, 通过常有以下的方法可用:...
用Oracle的加密包进行des3算法加密
Oracle中的bms_obfuscation_toolkit包定义了几种加密算法, 你可以用这个包来对需要的数据进行加密, 国外有人这样用的, 刚好那个库坏了向我求助, 所以我才知道. 对于这方面我们知道的实在有限. 将两个过程(加密和解密)放在一个包中, 定义如下: create or replace package mydes3 is function encrypt...
January 24, 2007
如何指定exp的query参数以导出部份记录?
Oracle的exp工具有一个query参数可以指定一个where条件来有条件地导出记录, 对于不经常用这个选项的人来说, 经常会遇到这样的错误: LRM-00112: multiple values not allowed for parameter 'query' EXP-00019: failed to process parameters, type 'EXP...
XMLTYPE类型的存贮属性如何修改?
几天前我告诉一个朋友说, XMLTYPE其实就是CLOB类型, 可以通过修改CACHE属性来提升CLOB类型的性能. 今天朋友就来问我XMLTYPE类型的列如何修改存贮特性. 凭着模糊的对于XMLTYPE是一个对象类型的一点印象, 我首先去看了一下这个对象类型的结构: SQL> DESC XMLTYPE METHOD ------ STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Type In/Out...
January 2, 2007
临时表使用错误: ORA-14452
在Oracle中遇到这样的错误, 是什么含义呢? ORA-00604: 递归 SQL 层 1 出现错误 ORA-14450: 试图访问已经在使用的事务处理临时表 首先要查一下错误信息, 可以从手册中查: Cause: An attempt was...
ORA-00600 [qertbFetchBYRowid] & Orphan ROWID
绝对地来说Oracle在更新表时肯定会自动维护索引的, 不过由于程序的Bug(4258825, 4000840)在有些条件下Insert/Delete/Update表的记录后, Oracle没有维护索引, 就好象是这样的情况, 表中有5条记录(ID=1,2,3,4,5), 这时索引是好的, 现在删除ID=5的记录留下四条, 然后Oracle没有维护这个索引还是保留了5条, 当我们发出WHERE ID=5这样的查询时, 就出现问题了啊, 因为根据ROWID找出来的记录是不对的, 这个称为Orphan ROWID. 这样的信息其实在alert_sid.log中会有记录的,...
December 19, 2006
为什么LOB或LOB Index的分区名称和表的分区名不同?
当我们创建一个LOCAL的索引时, 这个索引各个分区的名称和表的相应分区的名称是相同的, 但LOB分区及LOB Index分区的名称则是系统产生的. 不知道Oracle为什么顺道改一下? 下面的查询结果是在10g上进行的, 创建了一个有CLOB字段的分区表, 然后到OBJ$中去查询: SQL> select obj#,name, subname from obj$ 2 where owner#=25 and...
December 18, 2006
为什么聚簇表的空间扩得这么厉害?
问题从ITPub.net而来: 我两张表, 分别各600m数据, 有相同得PK,每张表表只有两个字段, 然后建立聚簇, 这个居然有4G多了? 晕! 当然晕的肯定是你了, 不是Oracle, 这个问题, 我的第一反应是你没有指定SIZE参数, 先来看一段说明吧. ...
December 13, 2006
9i/10g中MTS参数的一点变更
9i中mts_dispatchers和mts_max_dispatchers虽已过时, 但还保留. 通过SYSMOD一列可以看出, MAX_DISPATCHERS参数和MAX_SHARED_SERVERS参数不能在SYSTEM一级动态修改. 另外在9i中DISPATCHERS参数不能改成空的值. ASQL> ora parameter dispatchers NAME ISDEFAULT SESMOD SYSMOD VALUE ------------------- --------- ------ --------- ----- dispatchers ...
December 5, 2006
连接数据库一定要配置tnsnames.ora文件吗?
下面这个连接方式在8i/9i/10g的客户端下都可以连接: C:\>sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Tue Dec 5 17:40:22 2006 Copyright (c) 1982, 2005,...
November 8, 2006
网络断了三天, Data Guard如何继续自动恢复?
朋友问了这个问题, 其实我对Data Guard不熟, 但猜想在Oracle实现的日志传送中, 会将日志文件的信息存放在某个地方, 以便实现自动恢复. 现在遇到的问题是有部分日志只 能手工拷贝到Standby机器了, 只要将这些日志文件的信息注册进去然后应当就可以了吧. 想到这儿就查了Data Guard概念与命令手册(A96653.pdf/9i)一书, 找到了如下命令: ALTER DATABASE REGISTER [OR REPLACE] [PHYSICAL...
November 4, 2006
ORA-27101: shared memory realm does not exist
今日网友向我求教, 说是不加tnsname可以连接数据库, 而加了tnsname则出现标题中的错误, 他百思不得其解. 因为ping和tnsping都没有问题, 但用SQL*Plus去试时就是出错, 一开始我也有点不明白. 我让他发了listener.ora, tnsnames.ora和alert_sid.log给我, 在初始化参数中发现了下面两行: instance_name = wds dispatchers = (PROTOCOL=TCP)...
October 19, 2006
如何对MVIEW进行直接的DML操作来进行刷新?
在我的机器上有一个MVIEW (MV_FACT_SALES), 直接更新肯定是不行的, 会报以下错误: SQL> DESC MV_FACT_SALES Name Null? Type ----------------------- -------- ------------- F_MONTH VARCHAR2(7) M_AMOUNT1 NUMBER M_AMOUNT2 NUMBER SQL> INSERT INTO MV_FACT_SALES...
October 14, 2006
多个列的Range分区时, 记录会到哪个分区?
今天网友问了我一个关于多个列的Range分区的问题, 说是记录没有进入到他想要的分区, 由于在实际应用中我还没有用过这样的分区, 在理解那条记录要进入那个分区时, 还真有点难, 在一个列时, 是用小于来判断的, 那多个列时, 不是每个列都是用小于来判断的. 作为一个组合字段, 前导的字段是用小于等于来排序的, 我们可以想着"A2 不知道我自已在说什么? 总之这种情况下不是两个列都是用小于来比较的. create table...
Query Rewrite的一般理解之六
MVIEW的刷新也是一个比较难的话题, 尤其是遇到比较复杂的情况下, 如何实现增量刷新, 为什么现在的MVIEW不能实现增量刷新, 一直是我当初在实施MVIEW时遇到的最大问题, 在Oracle中也提供了一个过程可用于分析MVIEW, 这个过程在DBMS_MVIEW这个包中, 过程名为EXPLAIN_MVIEW. 对这个过程有所了解可以帮助你更好地实现MVIEW的应用. 在输出的信息中包括了是否可以实现增量刷新, 同时也列出了这个实体化视图上支持什么样的查询重写(文字匹配, 或一般函义上的重写). 要使用这个功能, 需要建一个名称为MV_CAPABILITIES_TABLE的表, 可以调用@?/rdbms/admin/utlxmv.sql来创建. 这个表的表结构如下:...
Query Rewrite的一般理解之五
对于一个给定的SQL, 和现有的MVIEW, 这个SQL可能被Rewrite, 也可能不能被Rewrite, 如何找出这其中的原因呢, 靠经验可以解决一些问题, 不过所花的时间就要长一点了. 其实在Oracle中提供了一个函数可以用于解释为什么某个SQL不能被重写, 这个过程位于dbms_mview这个包中, 过程名为explain_rewrite, 有了这个工具, 可以快速地找出为什么不能被重写, 要使用这个过程, 你需要事先创建一个表REWRITE_TABLE, 可以通过@?/rdbms/admin/utlxrw.sql来创建....
Query Rewrite的一般理解之四
可以看到MVIEW在Query Rewrite中的重要性, 要在实际应用中使用, 就得知道它的很多方面, 其中刷新是最主要的: 1, MVIEW日志的建立2, 汇总型的MIVEW的刷新3, JOIN类型的MVIEW的刷新4, 更复杂的MVIEW的刷新5, 分区时的MVIEW的刷新 在这儿我们主要讨论的是如何实现Fast刷新, 否则没有多少意议的. 我们一点一点来看:...
Query Rewrite的一般理解之三
在Query Rewrite中大家看到这个技术离不开一样东西, 实体化视图, 简称MVIEW. 这是Oracle在8i中首先推出的技术, MVIEW除了在Query Rewrite中使用外, 还在Master - Slave复制中有很重要的作用, 在这儿我们主要关心Query Rewrite相关的地方, Oracle在Query Rewrite方面越来越强了, 在Oracle 8i中基本上是Text Match的Query Rewrite, 在9i/10g中有很大的更新了, 还支持一般的Query...
Query Rewrite的一般理解之二
在Oracle的Query Rewrite中主要有三点, 第一是要使用CBO; 第二是要设置query rewrite enabled参数为TRUE; 第三是要先择设置query rewrite integrity参数的值(stale_tolerated, trusted, enforced). 对于第一点, 我们最好analyze相关的表及索引及MV; 对于第二点,这个参数只有两个值(true, false), 很简单; 对于第三点, 我们先来看Oracle的官方对于这个参数的解释: ENFORCED Oracle...
Query Rewrite的一般理解之一
Query Rewrite 在数据仓库是是一个非常有用的技术, Tom在<<Effective Oracle by Design>>一书中将实体化视图(MView)称为是数据仓库的索引, 这是再贴切不过的了, 在OLTP中当SELECT语句的所有的字段都在索引中时, Oracle可以不从表读数据, 而直接从索引中获得全部信息, 而Query Rewrite则是通过创建中间表, 让Oracle自动从创建的中间表读取数据, 而不需要从原表读取了, 这个中间表可以是预先join好的或预先计算好的中间结果. 他的使用就和一般的索引同理了, 虽然你指定的还是那个大表, 但oracle可以为你自动识别可以从那个"数据仓库索引"中读取数据....
October 11, 2006
数据库优化中什么是星型转换(Star Transform)?
在数据仓库中经常查询的SQL总带有下列特征: 几个表进行关联 只有一个数据量巨大的表, 称为事实表 其他的都是编码表, 称为维表 维表和事实表之间有主外键关系 假设有D1(key1),D2(key2),D3(key3),D4(key)四个小的维表和一个事实表F(key1,key2,key3,key4), 那么经常进行的查询将是: SELECT D1.xxx, D2.xxx, D3.xxx, D4.xxx, SUM(F.xxx), SUM(F.xxx)...
October 9, 2006
利用维对象来优化数据仓库的高级技巧
在Oracle的数据仓库(OLAP)中, 实体化视图(MVIEW), 查询重写(Query Rewrite)和维(Dimension)是非常重要的优化手段, 对于前两者我不想在这儿重复讲了, 主要来体验一下维的作用. 要发挥维的作用, 还是需要用到前面两者, 下面是我设计的只有一个维表的最简单的例子. 数据库用户除了connect, resource外, 还要给予Query Rewrite, Create Materialized View, Create Dimension权限....
October 3, 2006
体验一下数据仓库(OLAP)中的立方体(Cube)
04年以前的一段时间, 我接触数据仓库系统比较多, 在空余的时间中, 用Java写了一个简单的, 功能很弱的ROLAP示例程序, 现在想想还是比较有意思的, 因为越来越写不动程序了, 所以只好回忆一下以前的程序了. 这个程序是用Oracle 9i中SH用户下的表来做演示的, 如果你的Oracle中装了这些演示用户, 你可以试试. 首先下载My OLAP Viewer, 并解压到安装目录就可以了....
October 1, 2006
如何杀掉Windows上Oracle的Server线程?
有时会遇到Oracle的会话挂起并占用大量CPU的情况, 用kill session也没有用, 当然这时有可能在做一些会话级的ROLLBACK的操作, 如果遇到这种情况还是等等吧, 否则你可以强行杀掉Server进程(Windows是线程), 在Linux/Unix的进程是很容易杀的, 在Windows下则可以用Oracle提供的orakill命令, 使用语法如下: Usage: orakill sid thread where sid = the Oracle instance to...
September 13, 2006
如何在较长的文本字段上建立有效的索引?
索引的键值太大的话会影响索引的效率, 还有可能出错. 但有时我们一定要为这字段建索引的话怎么办呢? 我们可以通过计算一个哈希值来实现. 比如有一个字段为NAME, 最长可能有1024个字符, 要在这个列上建一个索引的话, 可以有两种比较好的方法: 增加一个字段, 如HASH_NAME, 用于保存HASH值. 建一个函数索引. 第一种方法需要有一个建在Insert或Update上的触发器来更新HASH_NAME字段, 第二种方法相对简单, 在Oracle的高版本中, 可以用第二种方法....
September 8, 2006
基于分区统计信息的SQL执行计划的性能问题
在Oracle 9i的CBO优化器中, 会对有绑定变量的SQL在硬分析时做一次Peaking, 这时如果分区表的各个分区的统计信息不一致不同能导致执行计划不同的话, Peaking就有可能出错了. 下面是我做的一个例子(9.2.0.5的库上测试的). 创建一个测试表: SQL> create table t_partplan 2 ( 3 ...