oracle数据库使用的一些技巧(7)

2019-05-24 14:12

[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进程来慢慢进行清除了,而你恰恰又是个急脾气。


oracle数据库使用的一些技巧(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:胺 值 测 量

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: