美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 数据库 > oracel >

ORACLE中seq$表更新频繁的分析

2017-09-01 10:16|来源:未知 |作者:dnzg |点击:
在分析ORACLE的AWR报告时,发现SQL ordered by Executions(记录了按照SQL的执行次数排序的TOP SQL。该排序可以看出监控范围内的SQL执行次数)下有一个SQL语句执行非常频繁,一个小时执行了上万次:
 
update seq$ set increment$=:2, minvalue=:3, maxvalue=:4, cycle#=:5, order$=:6, cache=:7, highwater=:8, audit$=:9, flags=:10 where obj#=:1
 
那么seq$这个数据字典表是做什么用的呢? 其实这个数据字典表是保存的是数据库下序列对象(SEQUENCE)的相关信息,而且它用来维护序列的变化。如下所示,我们通过实验来验证一下,我们启用10046事件,跟踪一下会话(level=4 表示启用SQL_TRACE并捕捉跟踪文件中的绑定变量),我们跟踪会话创建序列的过程。下面测试环境为Oracle 11g
 
SQL> show user;
USER is "TEST"
SQL> alter session set events '10046 trace name context forever, level 4';
 
Session altered.
 
SQL> create sequence my_sequence_test
  2  start with 1
  3  increment by 1
  4  maxvalue 999999999
  5  nocache;
 
Sequence created.
 
SQL> alter session set events '10046 trace name context off';
 
Session altered.
 
SQL> SELECT    a.VALUE
  2         || b.symbol
  3         || LOWER(c.instance_name)
  4         || '_ora_'
  5         || d.spid
  6         || '.trc' trace_file
  7    FROM (SELECT VALUE
  8            FROM v$parameter
  9           WHERE NAME = 'user_dump_dest') a,
 10         (SELECT SUBSTR (VALUE, -6, 1) symbol
 11            FROM v$parameter
 12           WHERE NAME = 'user_dump_dest') b,
 13         (SELECT instance_name
 14            FROM v$instance) c,
 15         (SELECT spid
 16            FROM v$session s, v$process p, v$mystat m
 17           WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d
 18  /
 
TRACE_FILE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/gsp/gsp/trace/gsp_ora_28201.trc
 
[oracle@DB-Server trace]$ tkprof gsp_ora_28201.trc  anay_out_28201.txt aggreage=yes;
LRM-00101: unknown parameter name 'aggreage'
error during command line parsing, cannot continue.
[oracle@DB-Server trace]$ tkprof gsp_ora_28201.trc  anay_out_28201.txt aggregate=yes;
 
TKPROF: Release 11.2.0.1.0 - Development on Tue Aug 29 22:52:08 2017
 
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
 
 
使用tkprof将跟踪文件转换成可读格式的文件后,你会注意到:在创建序列时,会往数据字典表seq$中插入一条记录(其实创建序列的本质就是在seq$和obj$中插入了一条记录),如下截图所示:
 
clip_image001
 
 
tkprof格式化后的输出文件里面,没有绑定变量,在原始跟踪文件gsp_ora_28201.trc中,你可以看到对应绑定变量的值
 
 
clip_image002
 
 
使用下面脚本,你就会发现这个都是对应序列对象的一些信息(序列对象的OBJECT_ID、MINVALUE、MAXVALUE、CACHE等等)
 
 
SQL> show user;
USER is "SYS"
SQL> select obj#,increment$,minvalue,maxvalue,cycle#,cache,highwater
  2  from seq$
  3  where obj#=97570;
 
      OBJ# INCREMENT$   MINVALUE   MAXVALUE     CYCLE#      CACHE  HIGHWATER
---------- ---------- ---------- ---------- ---------- ---------- ----------
     97570          1          1  999999999          0          0          1
 
SQL> select object_type,object_name from dba_objects
  2  where object_id=97570;
 
OBJECT_TYPE         OBJECT_NAME
					
(责任编辑:dnzg)