Page 1 of 712345...Last »

Oracle Histogram Investigation

这段时间有客户的10gR2数据库经常遭遇执行计划不稳定的现象,应该是直方图信息(Histogram)+绑定变量窥视(Bind Variable Peeking)造成的问题,藉此分享一下直方图的使用经验,但是我非常希望能听到针对本文的不同声音。测试环境Oracle 11.2.0.1 for Windows X64。

创建一个测试表。

DROP TABLE t; CREATE TABLE t AS SELECT rownum n1, ROUND(rownum/100) n2, ‘xxxx’ n3 FROM dba_objects WHERE rownum<=10000;

这样我们生成了一张表T,其中有一万行记录。 N1字段可以认为是主键,有10000个distinct值(1-10000),这是一个数据分布均匀的字段; N2字段有101个distinct值,除了第一个值0和最后一个值101之外,其它的值都有100行记录,我们可以认为这是一个数据分布均匀的字段; N3字段有10000个值都是xxxx,实际上这也仍然是一个分布均匀的字段。

对于这三种类型的字段,我们都不应该去收集直方图信息,因为没有意义。那么直方图信息之所以需要存在的根本意义在哪里?

一. 我们何时该做 直方图究其根本实际上就是一个数据分布的图示,这个图示是为了在生成SQL执行计划的时候给Oracle的CBO更多的信息,换句话说,就是当在where条件中的某些列可能由于列值的不同而希望CBO制定出不同的执行计划时,我们需要直方图。

反过来说,什么情况下我们不需要直方图呢?或者说直方图的存在是没有意义的呢? 1. 当此列不用于查询时,也就是这个字段永远不会出现在where条件中(注意:即使是用于表连接那也算是出现在where条件中)。 2. 当此列无论给予什么比较值,我们都希望永远是一种执行计划时。上面例子中的3个字段都属于这种情况。 对于N1或者N2出现在where条件中,我们希望永远是用该列上的索引扫描(当然需要在该列上先创建索引),对于N3出现在where条件中,我们希望永远是全表扫描。这样的执行计划的制定,只要有表级别的统计信息就足够了,直方图信息的出现不但不会对制定正确的执行计划有帮助,甚至会出现奇怪的现象导致执行计划不稳定。

二. 我们可以怎样做 那么我们继续看一下收集直方图信息的方法,众所周知,是需要使用DBMS_STATS.GATHER_TABLE_STATS存储过程的,并且是由这个存储过程中的method_opt参数决定的。可以由以下几种选择。

method_opt=>’for columns size skewonly [column_name]‘ 什么是SKEWONLY?先看一下Oracle官方文档中的定义。

Oracle determines the columns to . . . → Read More: Oracle Histogram Investigation

Issues when Add Nodes into RAC 10g

近期在客户处将原先的4节点RAC扩充到8节点。期间碰到一些问题,总结一下。

系统环境: Redhat Enterprise Server 4,Oracle RAC 10.2.0.4,OCFS2

一。现象: 往CRS中添加节点时运行rootaddnode.sh会报PRKC-1044错误。 PRKC-1044 – FAILED TO CHECK REMOTE COMMAND EXECUTION

原因: 在配置ssh对等性的时候,设置的passphrase非空。

解决方法: 重新配置ssh对等性,在Enter passphrase (empty for no passphrase): 时直接回车,不要输入任何密码。

二。现象: 在使用dbca往RAC中添加新节点时报TNS-04602错误。 TNS-04414: File Error caused by: TNS-04602: Invalid syntax error: Expected “LITERAL” before or at…

原因: 数据库中没有设置remote_listener参数。

解决方法:

alter system set remote_listener=’LISTENERS_RAC’ scope=both;

三。总结 . . . → Read More: Issues when Add Nodes into RAC 10g

How to change private interface in 10g cluster

如果要修改Private Interface的实际IP地址,必须要在操作系统级别修改,比如通过ifconfig命令以及修改/etc/hosts文件等,而为了避免发生node evictions,需要保证CRS stack down。在修改完IP地址以后,再重新让CRS stack up,才可以使用oifcfg命令修改保存在OCR中的信息。

在10gR2以前起停CRS Stack使用init.crs。

#init.crs stop #init.crs start

在10gR2以后可以使用crsctl命令。

#crsctl stop crs #crsctl start crs

1. 检查当前的网络资源配置

% $ORA_CRS_HOME/bin/oifcfg getif

2. 删除原先的Private Interface设置

% $ORA_CRS_HOME/bin/oifcfg delif –global eth1

3. 添加新的Private Interface设置(此处例子仅仅修改subnet,如果修改了eth1,就是修改了interface name)

% $ORA_CRS_HOME/bin/oifcfg setif –global eth1/192.168.1.0:cluster_interconnect

4. 再次检查网络资源配置确认已经修改成功

% $ORA_CRS_HOME/bin/oifcfg getif

5. 重新启动数据库实例,以确认RAC使用了正确的Private Interface作Cache Fusion。在告警日志中检查如下输出:

Cluster communication is . . . → Read More: How to change private interface in 10g cluster

Page 1 of 712345...Last »