Oracle Tips

查看哪些SQL语句消耗资源:
select * from
(select SQL_TEXT,EXECUTIONS,DISK_READS,BUFFER_GETS from v$sqlarea order by BUFFER_GETS desc)
where rownum <= 10;
 
查看表空间占用率:
SQL> col tablespace_name format a15
SQL> select a.tablespace_name,    a.bytes/1024/1024 totalbytes,  sum(b.bytes)/1024/1024 freebytes
,
round(100-sum(nvl(b.bytes,0))/(a.bytes)*100,2)||'%' used_percent
from   dba_data_files a,  dba_free_space b
where  a.file_id  =  b.file_id
group  by a.tablespace_name, a.bytes
order  by a.tablespace_name;   2    3    4    5    6

查看锁:
  SELECT DECODE(request,0,'锁持有者 ','等待者') as Type,sid  as SessionID,
         id1, id2, lmode, request, type
    FROM V$LOCK
   WHERE (id1, id2, type) IN
             (SELECT id1, id2, type FROM V$LOCK WHERE request>0)
   ORDER BY id1, request

HP系统内核参数意义:
shmmax
  含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。
  设置方法:0.5*物理内存
  例子:Set shmsys:shminfo_shmmax=10485760
  shmmin
  含义:共享内存的最小大小。
  设置方法:一般都设置成为1。
  例子:Set shmsys:shminfo_shmmin=1:
  shmmni
  含义:系统中共享内存段的最大个数。
  例子:Set shmsys:shminfo_shmmni=100
  shmseg
  含义:每个用户进程可以使用的最多的共享内存段的数目。
  例子:Set shmsys:shminfo_shmseg=20:
  semmni
  含义:系统中semaphore identifierer的最大个数。
  设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大的那个processes的那个值加10。
  例子:Set semsys:seminfo_semmni=100
  semmns
  含义:系统中emaphores的最大个数。
  设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Oracle实例的个数。
  例子:Set semsys:seminfo_semmns=200
  semmsl:
  含义:一个set中semaphore的最大个数。
  设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。
  例子:Set semsys:seminfo_semmsl=-200


性能测试:
select SQL_TEXT,DISK_READS,executions,buffer_gets from v$sqlarea order by disk_reads desc
select * from v$nls_parameters
select * from v$resource_limit
select * from v$parameter


可同时获得使用率(PCT USED)和碎片情况(FSFI)
col Tablespace format a24
select df.tablespace_name "Tablespace",
       df.bytes/(1024*1024) "Total Size",
       sum(fs.bytes)/(1024*1024) "Free Size",
       round(sum(fs.bytes)*100/df.bytes) "Pct Free",
       round((df.bytes-sum(fs.bytes))*100/df.bytes) "Pct Used",
    ROUND(100*SQRT(MAX(fs.bytes)/SUM(fs.bytes))*
    (1/SQRT(SQRT(COUNT(fs.bytes)))) ,2) FSFI
from dba_free_space fs, (select tablespace_name, sum(bytes) bytes
     from dba_data_files
      group by tablespace_name ) df         
where fs.tablespace_name = df.tablespace_name
group by df.tablespace_name, df.bytes


oracle查找锁的标准文档
$ORACLE_HOME/rdbms/admin/utllockt.sql

查找运行作业的进程ID
select b.spid from v$session a , v$process b, dba_jobs_running c where a.sid=c.SID and a.PADDR= b.ADDR
select b.spid from v$session a , v$process b, dba_jobs_running c where a.sid=c.SID and a.PADDR= b.ADDR and c.job =??

select a.sid from v$session a , v$process b where b.spid = 25924 and a.PADDR= b.ADDR

col sql_text format a50;
select sql_text from v$sqltext, v$session
where v$sqltext.hash_value = v$session.prev_hash_value
and v$sqltext.address = v$session.sql_address
and v$session.sid = (select a.sid from v$session a , v$process b where b.spid = 25924 and a.PADDR= b.ADDR)


获取长事务对象:
 select target,count(*)
 from v$session_longops
 group by target order by count(*)  desc;
 
获取对象占用空间
select owner,segment_name,bytes from dba_segments order by bytes desc

导出脚本
col text format a500
set heading off
spool test.out
select text from user_source;
spool off


--查看所有会话的信息,包括会话ID、用户名、状态、客户端机器名、运行的程序以及登陆时间
prompt show info of session
col username format a10;
col machine format a10;
col terminal format a10;
col program format a10;
select sid,serial#,username,status,machine,terminal,program,logon_time from v$session;

--查看所有会话的锁
--一般情况下返回记录数应为0,如果有记录应该检查等待时间(字段ctime,单位秒),
--如果等待时间较长则需要检查该会话是否被其他会话的锁阻塞,字段request不为0表示该会话在等待其他会话释放锁而被阻塞,
--字段request为0表示该会话已获得锁,block不为0表示该会话阻塞了其他会话。
prompt show info of lock
select sid,type,id1,id2,lmode,request,ctime,block from v$lock where type in ('TM','TX');

--查看被锁锁住了的对象
prompt show object be locked
col "loked object" format a20;
col "os user" format a20;
col "oracle user" format a20;
col "os process id" format a20;
select b.object_name "loked object",a.session_id "session id",a.oracle_username "oracle user",
a.os_user_name "os user",a.process "os process id" from v$locked_object a,dba_objects b
where a.object_id = b.object_id;


--查询锁涉及到的SQL语句
prompt show sqltext issued by locked object
col sql_text format a50;
select sql_text from v$sqltext, v$session
where v$sqltext.hash_value = v$session.prev_hash_value
and v$sqltext.address = v$session.sql_address
and v$session.sid
in
(select distinct sid from v$lock where ctime>0 and  type in ('TM','TX'));

--查看SQL语句执行情况
--查看SQL缓冲池中物理读最多的语句
prompt show disk_read info
select * from (
select sql_text, disk_reads/executions "Avg Disk_Reads", executions from V$SQLArea
where executions > 0 order by disk_reads/executions desc
)where rownum <= 20;

--查看SQL缓冲池中逻辑读最多的语句
prompt show buffer_gets info
select * from (
select sql_text, buffer_gets/executions "Avg Disk_Reads", executions from V$SQLArea t
where executions > 0 order by buffer_gets/executions desc
)where rownum <= 20;


NOTE:163424.1

获取热点块对象
select CHILD#  "cCHILD",      ADDR    "sADDR",      GETS    "sGETS",      MISSES  "sMISSES",      SLEEPS  "sSLEEPS"
from v$latch_children
where name = 'cache buffers chains'
order by 4, 1, 2, 3;

获取热点块对象
select /*+ RULE */
  e.owner ||'.'|| e.segment_name  segment_name,
  e.extent_id  extent#,
  x.dbablk - e.block_id + 1  block#,
  x.tch,
  l.child#
from
  sys.v$latch_children  l,
  sys.x$bh  x,
  sys.dba_extents  e
where
  x.hladdr='以上语句查询到得ADDR'
  e.file_id = x.file# and
  x.hladdr = l.addr and
  x.dbablk between e.block_id and e.block_id + e.blocks -1
  order by x.tch desc ;

获取热点块对象
select /*+ use_hash(bh) */
  de.owner ||'.'|| de.segment_name  segment_name,
  de.segment_type segment_type,
  de.extent_id  extent#,
  bh.dbablk - de.block_id + 1  block#,
  bh.tch
from
  sys.x$bh  bh,
  sys.dba_extents  de
where
  de.file_id = bh.file# and
  bh.dbablk between de.block_id and de.block_id + de.blocks -1
  and bh.tch > 10
order by bh.tch

获取热点块对象
select /*+ ordered */
  de.owner ||'.'|| de.segment_name  segment_name,
  de.segment_type segment_type,
  de.extent_id  extent#,
  bh.dbablk - de.block_id + 1  block#,
  bh.lru_flag,
  bh.tch,
  lc.child#
from
  (select max(sleeps) maxsleeps
   from v$latch_children
   where name='cache buffers chains'
  ) max_sleeps,
  v$latch_children ls
  sys.x$bh  bh,
  sys.dba_extents  de
where
  lc.name = 'cache buffers chains' and
  lc.sleeps>(0.8*maxsleeps) and
  bh.hladdr=lc.addr and
  de.file_id = bh.file# and
  bh.dbablk between de.block_id and de.block_id + de.blocks -1
order by bh.tch

解决oracle工具乱码:
我的NLS_LANG原来是simplified chinese_china.zhs16gbk改为AMERICAN_AMERICA.ZHS16GBK就好了,在注册表中应该修改home0或homeN中NLS_LANG,oracle下的NLS_LANG没有用的。


分页的实现:
select * from ( select a.*, rownum r from t_userinfo a where rownum <= 6000 order by registertime ) where r >=3000


查看user trace文件
SELECT    d.VALUE
       || '/'
       || LOWER (RTRIM (i.INSTANCE, CHR (0)))
       || '_ora_'
       || p.spid
       || '.trc' trace_file_name
  FROM (SELECT p.spid
          FROM SYS.v$mystat m, SYS.v$session s, SYS.v$process p
         WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
       (SELECT t.INSTANCE
          FROM SYS.v$thread t, SYS.v$parameter v
         WHERE v.NAME = 'thread'
           AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
       (SELECT VALUE
          FROM SYS.v$parameter
         WHERE NAME = 'user_dump_dest') d
/

跟踪操作(以实体化视图刷新为例)
conn / as sysdba
@ORACLE_HOME/rdbms/admin/dbmssupp.sql
GRANT execute ON dbms_support TO hw;
CREATE PUBLIC SYNONYM dbms_support FOR dbms_support;

conn hw/hw
exec dbms_support.start_trace(waits=>TRUE,binds=>TRUE);
exec dbms_refresh.refresh('"HW"."G101"');
exec dbms_support.stop_trace;

tkprof $ORACLE_BASE/admin/<SID>/udump/*****.trc

跟踪其他进程代码
dbms_system.set_bool_param_in_session(
sid => 42,
serial# => 1215,
parnam => 'timed_statistics',
bval => true)

dbms_system.set_int_param_in_session(
sid => 42,
serial# => 1215,
parnam => 'max_dump_file_size',
intval => 2147483647)

dbms_system.set_bool_param_in_session(
sid => 42,
serial# => 1215,
parnam => 'timed_statistics',
bval => false)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值