0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=18) 1 0 INDEX (FULL SCAN) OF 'INX_O_tabname_STP' (UNIQUE)
通过FULL SCAN知道是索引扫描,而且使用的是INX_O_tabname_STP索引。
4.4.2 SQL语句是否使用了最恰当的索引
通过“4.4.1”,判断是否关键被判断的字段,和查询的字段都在索引里,如果是,则一般是使用了恰当的索引。
4.4.3 怎么提示SQL语句使用固定的索引 /*+ INDEX(tabname_CELLCIRCUIT) */ 4.4.4 怎么提示SQL语句固定使用全表扫描 /*+ FULL(o_tabname_stp) */ 例:
通过如下两个执行计划可知道提示生效 SQL> select ne_id from o_tabname_stp; Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=18) 1 0 INDEX (FULL SCAN) OF 'INX_O_tabname_STP' (UNIQUE) SQL>
SQL> select /*+ FULL(o_tabname_stp) */ ne_id from o_tabname_stp; Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=18) 1 0 TABLE ACCESS (FULL) OF 'O_tabname_STP' (Cost=2 Card=1 Bytes =18)
4.4.5 存储过程是否可以执行更少的、有效的SQL语句 1) 确保所有应该使用索引的SQL语句都使用了索引。 2) 通过设计判断,减少SQL语句的执行次数。 3) 努力减少执行次数多的SQL语句。 4.5 操作阻塞,锁情况
由于锁情况比较复杂,此处只讲已知某个在操作的用户出现锁的情况。
通过如下语句,查询出当前在被锁的表,表所属用户,操作系统用户名,通过这些信息,判断找出制造死锁的会话sid。
SQL>select o.owner,o.object_name,l.session_id,l.os_user_name from v$locked_object l,dba_objects o where o.object_id = l.object_id;
通过sid,使用如下语句,查找出数据库服务器上操作系统的后台连接进程或直接使用SQL语句杀死该会话。
1) 查找数据库服务器后台进程:
SQL> select spid from v$process where addr = (select paddr from v$session where sid= &sid);
如上语句,输入 session的sid ,即可查找相应的数据库服务器后台进程,直接使用%kill -9命令杀掉该进程即可。
2) 使用SQL语句杀掉该会话:
SQL> alter system kill session 'sid,serial#'; Sid,serial#可以从v$session视图查出。 5 FAQ
5.1 操作表数据提示数据文件错误 通过检查,判断数据文件状态:
? 数据文件状态不是ONLINE或SYSTEM 请提交工程部或数据库组处理。
检查文件状态方法可通过dbMonitor查看,也可通过 “3.9.1”小节方法查看。 数据文件状态是ONLINE?
1) 验证该操作表数据的语句错误再次出现。
2) 使用set autotrace traceonly explain的方法检查该语句是否使用索引。
3) 若使用了索引:则使用 /*+ FULL(表名) */ 的提示方法,选择表表操作判断是否问题依然出现。若问题不出现,则drop 该操作使用的索引,重新创建该索引;若问题出现,则exp表数据,drop条,重新创建表。
(若是同时操作多个表,则一个表一个表的使用/*+ table=表名 index=索引名 */ 的提示方法指定表单独使用索引,逐个排查)
使用set autotrace traceonly explain的方法和使用表提示的方法,请参考“4.4.1”。 5.2 从数据库服务器进程运行中,优化最消耗CPU的SQL语句 %prstat
获取PROCESS行为oracle字样,CPU超过1%的行的PID,此时使用 %sqlplus “/as sysdba” ----登陆数据库服务器 SQL> ---------执行如下SQL语句
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value), DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr =
(SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC; 系统会提示你输入PID的值: ---输入刚才准备的PID值 SQL> -----此时就会查出正在消耗CPU的语句。 使用SQL语句优化的方法优化此SQL语句。 5.3 导数据到新数据库指定用户的缺省表空间
我们常常从某台服务器的一个数据库exp导数据到另外一台服务器的一个数据库,发现imp后,很有可能没有使用新数据库的导入用户的缺省表空间。 使用语句:
SQL> select table_name,tablespace_name from user_tables; 可以查出表使用的表空间。
那是因为我们创建用户的时候,没有回收被创建用户对表空间的unlimited tablespace 权限,我们使用语句
SQL>revoke unlimited tablespace from 用户名;
收回用户的unlimited tablespace 权限,此时再在默认缺省表空间上分配该权限: SQL>alter user 用户名 quota unlimited on 缺省表空间名;
再导入测试,如果还不行,发现总是导入到某个表空间ABC上,则使用如下语句: SQL>alter user 用户名 quota 0 on ABC;
回收用户在该表空间的配额分配权限,重新导入,则一定可以矫正过来。 5.4 正确安装数据库软件,但无法创建库 现象:
在UNIX正确安装oracle 9i后,提示安装成功,但不能使用,提示OS错误 分析:
由于操作系统自己和硬件的原因,导致oracle的使用受到限制。 处理:
可通过如下两种方法解决:
1. 把启动参数processes参数修改的更底(降低一倍)。
2. 增加/etc/system文件中SEMMSL & SEMMNI的参数值(增加一倍)。Reboot系统再启动数据库。 5.5 打开数据库报告关闭错误,关闭数据库报告打开错误 现象:
数据库不可用,ORACLE关闭时报告数据库已经打开打开,打开数据库时报告数据库已经关闭。 分析:
一般这种情况是因为非正常关闭数据库造成,即一般使用abort 参数。还有就是实际用户定义的$ORACLE_SID与实际创建时候的SID不一样,这样系统找不到当前SID为启动SID,报告错误。 处理:
A) 检查.cshrc 中配置的$ORACLE_SID与用户在用户已经创建了的数据库SID范围内。
B) 把需要启动的数据库SID设置成当前系统默认SID,使用 setenv ORACLE_SID SID,这样只在当前窗口有效。关闭该窗口即无效。
C) 使用ipcs查看当前内存等中是否有残留内存等信息,如果有,使用ipcrm –m清除共享内存,使用ipcrm –s清除下一个。保证清除干净。
D) 检查后台进程,如果有在运行,直接使用kill -9 杀掉即可。查看:ps –ef |grep ora_ E) 此时再去打开数据库即可。 5.6 用户不能在数据库中创建对象 现象:
用户以前能正确在数据库中创建对象,突然不能创建用户对象。 分析:
此问题是因为在创建用户的时候没有分配配额,用户使用到一定时候后,就不能再创建对象了。 处理:
设置用户配额为无限制。
SQL>alter user user_name quota unlimited on user_default_tablespace; 5.7 导入导出错误 现象:
导入导出错误为:imp16,type 852 to 850等字符集错误。 分析:
用户当前配置字符集与安装时候的配置字符集不一致。 处理:
查看用户环境变量的NLS_LANG设置是否与与导出的时候一致,要求一致。其次,要求props$中对语言的设置与原来一致。可参考安装成功后对该.cshrc文件的备份。 5.8 不同版本的数据库数据导入导出 现象:
直接从一个版本中导出的数据,无法导入到不是同一个版本中的数据库。 分析:
由oracle自己的软件机制所决定。 处理:
使用与需要导入的目标数据库同样版本的客户端进行连接,然后在该客户端进行导出操作即可。 5.9 数据库挂起问题 现象:
已经进行连接的用户能够继续对数据库操作,未连接或曾经连接但是已经断掉的用户,如果再想连接,就会长时间等待。
关闭数据库,重新启动。暂时解决。但是过了三天左右,又开始出现这个问题。 分析:
1) 有可能是数据库处于归档模式,而又没有启动归档进程或者磁盘没有空间。 2) 进程产生死锁。 3) 其他原因 处理:
1) 归档进程问题:启动归档进程;磁盘空间问题:清理磁盘空间。 2) 死锁问题,重启数据库即可。 目前一个处理方法:
5.10 多个数据库操作方法:不同实例间转换. 现象:
在用户创建了多个数据库的时候,需要分别对不同的数据库进行管理。 分析:
在用户登录的时候,启动用户环境变量.cshrc,而在.cshrc中已经设置了当前数据库SID,所以要启动其他SID数据库,需要把他变为当前数据库SID。 处理:
只要把需要操作的数据库SID变为当前SID进行操作即可。有如下两种方法修改SID为SID。
比如有两个数据库SID分别为sdh和 sp,在.cshrc文件中定义的当前数据库为sdh,今需要对sp进行启动关闭等操作。
1) 修改.cshrc 文件中的setenv ORACLE_SID sdh项,修改为希望操作的数据库SID,即为setenv ORACLE_SID sp。然后使用source 命令使其生效即可把它变为当前SID。 2) 使用命令修改。执行%setenv ORACLE_SID sp即可。 此时再使用%sqlplus /nolog
SQL>conn /as sysdba连接的即为修改了的SID数据库了。 5.11 查询错误号信息 现象:
在数据库使用过程中,数据库会报告一些有如ora-XXXX,imp-XXXX等等错误号码。 分析:
该号码是发生错误,或者oracle系统提示时报告用户的一个标识。 处理:
使用如下方法获取该错误号码对应的报告信息: 比如报告ora-0042 %oerr ora 0042
5.12 查看oracle系统的版本
SQL> select banner from sys.v_$version; 5.13 查看oracle系统安装了哪些选项
相关推荐: