
Oracle的 事件 可以跟踪应用程序所执行的SQL语句 并且得到其解析次数 执行次数 CPU使用时间等信息 这对我们分析 定位数据库性能问题是非常有用的
event是oracle用于系统性能分析时的一个最重要的事件 当激活这个事件后 将通知oracle kernel追踪会话的相关即时信息 并写入到相应trace文件中 这些有用的信息主要包括sql是如何进行解析 绑定变量的使用情况 会话中发生的等待事件等
event 可分成不同的级别(level) 分别追踪记录不同程度的有用信息 对于这些不同的级别 应当注意的是向下兼容的 即高一级的trace信息包含低于此级的所有信息
event的追踪级别大致有
level :跟踪sql语句 包括解析 执行 提取 提交和回滚等
level :包括变量的详细信息
level :包括等待事件
level :包括绑定变量与等待事件
其中 level 相当于打开了sql_trace
前提条件
(先确保要event的会话环境符合条件)
必须确保timed_statistics为TRUE 这个参数可以在会话级上进行修改
为了确保trace输出能够完整进行 还要调整此会话对trace文件大小的限制 一般将此限制取消 即将max_dump_file_size设置为UNLIMITED 或者设置为一个很大的阙值
在满足了上述条件后 就可以启用 event对会话进行后台跟踪了
首先获得spid sid serial# machine为连接oracle的机器名
select b spid a sid a serial# a machine from v$session a v$process b where a paddr =b addr and a sid =
继续往下看 就可以知道为什么找到SPID了
事件启动 需要SYSDBA权限
SQL>execute sys dbms_system set_ev( )
PL/SQL procedure successfully pleted
参数说明
:SID
:SERIAL#
注意这里必须以sysdba登录
或者会话级别的跟踪
SQL>alter session set events trace name context forever level
会话已更改
在应用程序中执行对数据库的 *** 作
比如性能较差的一些查询 插入 删除 *** 作等
事件的关闭
SQL>execute sys dbms_system set_ev( )
PL/SQL procedure successfully pleted
或者对应上面的 在会话级别关闭
SQL>alter session set events trace name context off
会话已更改
获得产生的跟踪文件所在的目录
SQL>select value from v$parameter where name = user_dump_dest
转到该目录下可以看到生成了一个zftang_ora_ trc文件 此处的 即SPID的值
使用tkprof命令 转换TRC文件
在命令行下执行oracle的tkprof命令 将zftang_ora_ trc转化为文本文件
如
$ tkprof ora i_ora_ trc ora i_ora_ sql
tkprof /u /diag/rdbms/bysrac/bysrac /trace/bysrac _ora_ _TEST _ trc /home/oracle/test _ trc
此时在zftang_ora_ sql文件中 就可以看到刚才执行应用程序时所执行的sql语句的执行次数 CPU使用时间等数据
TRACE将消耗相当的系统资源 因此我们在使用TRACE的时候应当慎重 对于正式的系统 应当只在必要的时候进行TRACE *** 作 并且应当及时关闭
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
update test_ set flag = 测试
call count cpu elapsed disk query current rows
Parse
Execute
Fetch
total
Misses in library cache during parse:
Optimizer mode: ALL_ROWS
Parsing user id:
timed_statistics的理解
关于参数timed_statistics的一段解说
Without timed statistics Oracle records the reason for each wait before it begins to wait and when the wait is over it records whether it timed out But with timed statistics enabled Oracle checks the time just before and after each wait and also records the time waited The time waited is recorded in hundredths of a second that is centiseconds
本人的理解是 参数timed_statistics没有设置的话 Oracle只记录wait开始和wait结束这一段时间内的wait reason和wait结束是否是因为timed out 而设置timed_statistics=true后 Oracle就记录了wait的时间信息 有了这些时间信息可以确定等待事件在哪个时间段出现比较频繁 请指正
在timed_statistics = false时 我们只能够知道这些等待时间的次数(records the reason for each wait ) 以及等待时间timed out的次数(records whether it timed out)
lishixinzhi/Article/program/Oracle/201311/17966
触发器是一种特殊类型的存储过程 它不同于存储过程 触发器主要是通过事件进行触发而被执行的 触发器的触发事件分可为 类 分别是DML事件 DDL事件和数据库事件 而存储过程可以通过存储过程名字而被直接调用 当对某一表进行诸如UPDATE INSERT DELETE 这些 *** 作时 SQL Server 就会自动执行触发器所定义的SQL 语句 从而确保对数据的处理必须符合由这些SQL 语句所定义的规则
触发器是特定事件出现的时候 自动执行的代码块 类似于存储过程 但是用户不能直接调用他们
触发器功能
允许/限制对表的修改
自动生成派生列 比如自增字段
强制数据一致性
提供审计和日志记录
防止无效的事务处理
启用复杂的业务逻辑
触发器种类
触发器的种类可划分为 种 数据 *** 纵语言(DML)触发器 替代(INSTEAD OF)触发器 数据定义语言(DDL)触发器 数据库事件触发器
数据 *** 纵语言(DML)触发器 简称DML触发器 是定义在表上的触发器 创建在表上 由DML事件引发的触发器 编写DML触发器时的两点要素是 确定触发的表 即在其上定义触发器的表 确定触发的事件 DML触发器的触发事件有INSERT UPDATE和DELETE三种替代触发器 简称INSTEAD OF触发器 创建在视图上 用来替换对视图进行的删除 插入和修改 *** 作数据定义语言(DDL)触发器 简称DDL触发器 定义在模式上 触发事件是数据对象的创建和修改数据库事件触发器 定义在整个数据库或模式上 触发事件是数据库事件
ORACLE产生数据库触发器的语法为
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件 [OR 触发事件 ]
ON 表名
WHEN 触发条件
[FOR EACH ROW]
DECLARE
声明部分
BEGIN
主体部分
END
其中
触发器名 触发器对象的名称 由于触发器是数据库自动执行的 因此该名称只是一个名称 没有实质的用途 一个触发器可由多个不同的数据 *** 纵语言 *** 作触发 在触发器中 可用INSERTING DELETING UPDATING谓词来区别不同的数据 *** 纵语言 *** 作 这些谓词可以在IF分支条件语句中作为判断条件来使用
触发时间 指明触发器何时执行 该值可取 触发的时间有BEFORE和AFTER两种 分别表示触发动作发生在DML语句执行之前和语句执行之后 确定触发级别 有语句级触发器和行级触发器两种 语句级触发器表示SQL语句只触发一次触发器 行级触发器表示SQL语句影响的每一行都要触发一次
Before 表示在数据库动作之前触发器执行在SQL语句的执行过程中 如果存在行级BEFORE触发器 则SQL语句在对每一行 *** 作之前 都要先执行一次行级BEFORE触发器 然后才对行进行 *** 作 如果存在行级AFTER触发器 则SQL语句在对每一行 *** 作之后 都要再执行一次行级AFTER触发器
after 表示在数据库动作之后出发器执行 如果存在语句级AFTER触发器 则在SQL语句执行完毕后 要最后执行一次语句级AFTER触发器
触发事件 指明哪些数据库动作会触发此触发器 指INSERT DELETE或UPDATE事件 事件可以并行出现 中间用OR连接
insert 数据库插入会触发此触发器
update 数据库修改会触发此触发器
delete 数据库删除会触发此触发器
表 名 数据库触发器所在的表
for each row 表示触发器为行级触发器 省略则为语句级触发器 对表的每一行触发器执行一次
触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器 删除触发器的语法如下
DROP TIRGGER 触发器名
可以通过命令设置触发器的可用状态 使其暂时关闭或重新打开 即当触发器暂时不用时 可以将其置成无效状态 在使用时重新打开 该命令语法如下
ALTER TRIGGER 触发器名 {DISABLE|ENABLE}
其中 DISABLE表示使触发器失效 ENABLE表示使触发器生效
同存储过程类似 触发器可以用SHOW ERRORS 检查编译错误
如果有多个触发器被定义成为相同时间 相同事件触发 且最后定义的触发器是有效的 则最后定义的触发器被触发 其他触发器不执行 触发器体内禁止使用MIT ROLLBACK SAVEPOINT语句 也禁止直接或间接地调用含有上述语句的存储过程 定义一个触发器时要考虑上述多种情况 并根据具体的需要来决定触发器的种类
触发器的作用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性 除此之外 触发器还有其它许多不同的功能
( ) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束
( ) 跟踪变化Auditing changes
触发器可以侦测数据库内的 *** 作 从而不允许数据库中未经许可的指定更新和变化
( ) 级联运行(Cascaded operation)
触发器可以侦测数据库内的 *** 作 并自动地级联影响整个数据库的各项内容 例如 某个表上的触发器中包含有对另外一个表的数据 *** 作(如删除 更新 插入)而该 *** 作又导致该表上触发器被触发
( ) 存储过程的调用(Stored procedure invocation)
为了响应数据库更新触 发器可以调用一个或多个存储过程 甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行 *** 作
由此可见 触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题 例如 触发器能够找出某一表在数据修改前后状态发生的差异 并根据这种差异执行一定的处理 此外一个表的同一类型(INSERT UPDATE DELETE)的多个触发器能够对同一种数据 *** 作采取多种不同的处理
总体而言 触发器性能通常比较低
lishixinzhi/Article/program/Oracle/201311/18340
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)