[Q]Rman的format格式中的%s类似的东西代表什么意义 [A]可以参考如下 %c 备份片的拷贝数 %d 数据库名称
%D 位于该月中的第几天 (DD) %M 位于该年中的第几月 (MM)
%F 一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为日期,QQ是一个1-256的序列 %n 数据库名称,向右填补到最大八个字符 %u 一个八个字符的名称代表备份集与创建时间 %p 该备份集中的备份片号,从1开始到创建的文件数 %U 一个唯一的文件名,代表%u_%p_%c %s 备份集的号 %t 备份集时间戳 %T 年月日格式(YYYYMMDD)
第四部分、性能调整 menu
[Q]如何设置自动跟踪
[Q]如何跟踪自己的会话或者是别人的会话 [Q]怎么设置整个数据库系统跟踪 [Q]怎么样分析表或索引 [Q]怎么样快速重整索引 [Q]如何使用Hint提示
[Q]怎么样快速复制表或者是插入数据 [Q]怎么避免使用特定索引
[Q]Oracle什么时候会使用跳跃式索引扫描 [Q]怎么样创建使用虚拟索引
[Q]v$sysstat中的class分别代表什么 [Q]怎么杀掉特定的数据库会话
[Q] 如何有效的删除一个大表(extent数很多的表) [Q]如何收缩临时数据文件的大小 [Q]怎么清理临时段
[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构 [Q]如何获得所有的事件代码 [Q]怎么样快速重整索引 [Q]怎么快速查找锁与锁等待
[Q]怎样监控无用的索引
[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句 [Q]怎么样能固定我的执行计划 [Q]如何获得所有的事件代码
[Q]什么是STATSPACK,我怎么使用它? 第四部分、性能调整 [Q]如何设置自动跟踪 [A]用system登录
执行$ORACLE_HOME/rdbms/admin/utlplan.sql创建计划表
执行$ORACLE_HOME/rdbms/admin/plustrce.sql创建plustrace角色 如果想计划表让每个用户都能使用,则
SQL>create public synonym plan_table for plan_table; SQL> grant all on plan_table to public; 如果想让自动跟踪的角色让每个用户都能使用,则 SQL> grant plustrace to public; 通过如下语句开启/停止跟踪 SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
[Q]如何跟踪自己的会话或者是别人的会话 [A]跟踪自己的会话很简单
Alter session set sql_trace true|false or
exec dbms_session.set_sql_trace(TRUE); 如果跟踪别人的会话,需要调用一个包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false) 跟踪的信息在user_dump_dest 目录下可以找到 可以通过Tkprof来解析跟踪文件,如 Tkprof 原文件 目标文件 sys=n
[Q]怎么设置整个数据库系统跟踪
[A]其实文档上的alter system set sql_trace=true是不成功的 但是可以通过设置事件来完成这个工作,作用相等 alter system set events
'10046 trace name context forever,level 1'; 如果关闭跟踪,可以用如下语句 alter system set events
'10046 trace name context off'; 其中的level 1与上面的8都是跟踪级别 level 1:跟踪SQL语句,等于sql_trace=true level 4:包括变量的详细信息 level 8:包括等待事件
level 12:包括绑定变量与等待事件
[Q]怎么样分析表或索引
[A]命令行方式可以采用analyze命令
如Analyze table tablename compute statistics; Analyze index indexname estimate statistics;
ANALYZE TABLE tablename COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES
FOR ALL INDEXED COLUMNS; 等等。
如果想分析整个用户或数据库,还可以采用 Dbms_utility(8i以前的工具包) Dbms_stats(8i以后提供的工具包)
[Q]怎么样快速重整索引
[A]通过rebuild语句,可以快速重整或移动索引到别的表空间
rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数 语法为
alter index index_name rebuild tablespace ts_name storage(??);
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改 SQL> set heading off SQL> set feedback off SQL> spool d:\\index.sql
SQL> SELECT 'alter index ' || index_name || ' rebuild '
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);' FROM all_indexes
WHERE ( tablespace_name != 'INDEXES' OR next_extent != ( 256 * 1024 ) )
AND owner = USER SQL>spool off
另外一个合并索引的语句是
alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block 消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。
[Q]如何使用Hint提示
[A] 在select/delete/update后写/*+ hint */
如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1... 注意/*和+之间不能有空格 如用hint指定使用某个索引
select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab; select /*+ index(a cbotab1) */ col1 from cbotab a; 其中
TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;
如果索引名或表名写错了,那这个hint就会被忽略;
[Q]怎么样快速复制表或者是插入数据 [A]快速复制表可以指定Nologging选项 如:Create table t1 nologging as select * from t2;
快速插入数据可以指定append提示,但是需要注意
noarchivelog模式下,默认用了append就是nologging模式的。 在archivelog下,需要把表设置程Nologging模式。 如insert /*+ append */ into t1 select * from t2
注意:如果在9i环境中并设置了FORCE LOGGING,则以上操作是无效的,并不会加快,当然,可以通过如下语句设置为NO FORCE LOGGING。 Alter database no force logging;
是否开启了FORCE LOGGING,可以用如下语句查看 SQL> select force_logging from v$database;
[Q]怎么避免使用特定索引
[A]在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:
表test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。
在正常情况下,where a=? and b=? and c=?会用到索引inx_a, where b=?会用到索引inx_b
但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。
当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。 where a=? and b=? and c=? group by b||'' --如果b是字符 where a=? and b=? and c=? group by b+0 --如果b是数字 通过这样简单的改变,往往可以是查询时间提交很多倍
当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法: select /*+ no_index(t,inx_b) */ * from test t where a=? and b=? and c=? group by b
[Q]Oracle什么时候会使用跳跃式索引扫描
[A]这是9i的一个新特性跳跃式索引扫描(Index Skip Scan). 例如表有索引index(a,b,c),当查询条件为 where b=?的时候,可能会使用到索引index(a,b,c) 如,执行计划中出现如下计划:
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件: 1 优化器认为是合适的。
2 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。
3 优化器要知道前导列的值分布(通过分析/统计表得到)。 4 合适的SQL语句 等。
[Q]怎么样创建使用虚拟索引 [A]可以使用nosegment选项,如
create index virtual_index_name on table_name(col_name) nosegment; 如果在哪个session需要测试虚拟索引,可以利用隐含参数来处理 alter session set \最后,根据需要,我们可以删除虚拟索引,如普通索引一样 drop index virtual_index_name;
注意:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引 在一些小的表的测试上,虚拟索引不一定能提交查询速度。
[Q]v$sysstat中的class分别代表什么 [A]统计类别 1 代表事例活动
2 代表Redo buffer活动 4 代表锁
8 代表数据缓冲活动 16 代表OS活动 32 代表并行活动 64 代表表访问 128 代表调试信息
[Q]怎么杀掉特定的数据库会话
[A] Alter system kill session 'sid,serial#'; 或者
alter system disconnect session 'sid,serial#' immediate;
在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程) 在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程 一、问题的提出
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。