现在的位置: 首页 > 综合 > 正文

oracle每天一句sql

2013年09月03日 ⁄ 综合 ⁄ 共 4418字 ⁄ 字号 评论关闭

1、查看SQL语句的解析情况:

SELECT *
  FROM V$SYSSTAT
 WHERE NAME IN
       ('parse time cpu', 'parse time elapsed', 'parse count (hard)');

    这里"parse time cpu”是系统服务时间,"parse time elapsed"是响应时间,用户等待时间waite time = parse time elapsed - parse time cpu。

2、查看是什么SQL语句解析效率比较低:

SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA WHERE ROWNUM<10 ORDER BY PARSE_CALLS; 

    可以优化这些语句,或者增加Oracle参数SESSION_CACHED_CURSORS的值。

     查看使用频率最高的10条sql

select sql_text, executions,sysdate
  from (select sql_text,
               executions,
               rank() over(order by executions desc) exec_rank
          from v$sql)
 where exec_rank <= 10; 

 

3、根据v$process中的pid值到v$session中找到对应的sid:

SELECT SID, SERIAL#, USERNAME, MACHINE
  FROM v$session b
 WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid');

      根据sid获取sql

select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.SID='&sid')
ORDER BY piece ASC;

 

4、寻找CPU使用过量的session ,找出高CPU利用率的SQL:

SELECT sql_text
  FROM v$sqltext a
 WHERE (a.hash_value, a.address) IN
       (SELECT decode(sql_hash_value, 0, prev_hash_value, sql_hash_value),
               decode(sql_hash_value, 0, prev_sql_addr, sql_address)
          FROM v$session b
         WHERE b.paddr =
               (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
 ORDER BY piece ASC;

5、查看每个Session的CPU利用情况:

select ss.sid, se.command, ss.value CPU, se.username, se.program
  from v$sesstat ss, v$session se
 where ss.statistic# in
       (select statistic#
          from v$statname
         where name = 'CPU used by this session')
   and se.sid = ss.sid
   and ss.sid > 6
 order by ss.sid;

6、比较上述Session(第5个),看那个session的CPU使用时间最多,然后查看该Session的具体情况:

select s.sid, s.event, s.wait_time, w.seq#, q.sql_text
  from v$session_wait w, v$session s, v$process p, v$sqlarea q
 where s.paddr = p.addr
   and s.sid = &p
   and s.sql_address = q.address;

得到上述信息后,查看相应操作是否有hash joins 和 full table scans。如果有hash joins 和 full table scans那么必须创建相应的Index或者检查Index是否有效。
7、用来查询数据文件、临时文件与表空间对应及数据文件序号:

select ts.tablespace_name, df.file_name, df.file_id, tf.file_name
  from dba_tablespaces ts, dba_data_files df, dba_temp_files tf
 where ts.tablespace_name = df.tablespace_name(+)
   and ts.tablespace_name = tf.tablespace_name(+);

8、根据spid查出正在运行的sql

select b.sid,
       b.serial#,
       b.status,
       b.osuser || ':' || b.terminal || ':' || b.program || '@' ||
       b.machine as hostuserapp,
       a.piece,
       a.sql_text
  from v$sqltext_with_newlines a, v$session b
 where a.address(+) =
       decode(b.sql_hash_value, 0, b.prev_sql_addr, b.sql_address)
   and a.hash_value(+) =
       decode(b.sql_hash_value, 0, b.prev_hash_value, b.sql_hash_value)
   and b.type <> upper('background')
   and b.sid in (select b.SID
                   from v$process a, v$session b
                  where a.addr = b.PADDR
                    and a.spid = &spid)
 order by b.sid, a.piece;

9、定位消耗资源多的sql

select sql_text from v$sql where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 3000);

10、查询系统资源 (sessions和process连接数情况)

SELECT resource_name,
       current_utilization,
       max_utilization,
       LIMIT,
       ROUND(max_utilization / LIMIT * 100) || '%' rate
  FROM (SELECT resource_name,
               current_utilization,
               max_utilization,
               TO_NUMBER(initial_allocation) LIMIT
          FROM v$resource_limit
         WHERE resource_name IN ('processes', 'sessions')
           AND max_utilization > 0);
alter system set processes=500 scope=spfile;
alter system set sessions=500 scope=spfile; 

然后重启数据库

11、查询当前数据库使用全表扫描的SQL

select a.sid,
       a.serial#,
       a.username,
       a.status,
       a.program,
       a.machine,
       c.sql_text
  from v$session a, v$session_wait b, v$sql c
 where a.sid = b.sid
   and a.sql_hash_value = c.hash_value
   and a.sql_address = c.address
   and b.event like 'db file scattered read%';

12、查询表空间使用、分配等情况

select (select decode(extent_management,'LOCAL','*',' ') || 
               decode(segment_space_management,'AUTO','a ','m ')
         from dba_tablespaces where tablespace_name = b.tablespace_name) || nvl(b.tablespace_name, 
          nvl(a.tablespace_name,'UNKOWN')) name,
      MB_Allocated MB_Allocated, 
      MB_Allocated-nvl(Free_MB,0) used,
      nvl(Free_MB,0) free, 
      ((MB_Allocated-nvl(Free_MB,0))/ 
                    nvl(Max_MB,MB_Allocated))*100 pct_used,
      nvl(Max_MB,MB_Allocated) Max_Size,
      decode( Max_MB, 0, 0, (MB_Allocated/Max_MB)*100) pct_max_used
from ( select sum(bytes)/1048576 Free_MB, 
           max(bytes)/1048576 largest,
           tablespace_name
      from  sys.dba_free_space 
      group by tablespace_name ) a,
     ( select sum(bytes)/1048576 MB_Allocated, 
           sum(maxbytes)/1048576 Max_MB,
           tablespace_name 
      from sys.dba_data_files 
      group by tablespace_name 
      union all
      select sum(bytes)/1048576 MB_Allocated, 
           sum(maxbytes)/1048576 Max_MB,
           tablespace_name 
      from sys.dba_temp_files 
      group by tablespace_name )b
where a.tablespace_name (+) = b.tablespace_name
order by 1
/

13、查询创建表空间的原始语句

SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;

 14、查询oracle一张表的数据块上有多少条记录

select dbms_rowid.rowid_block_number(rowid),count(dbms_rowid.rowid_block_number(rowid)) from t group by dbms_rowid.rowid_block_number(rowid);
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) COUNT(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
------------------------------------ -------------------------------------------
                               28584                                          68   -指第28584号块上有68条记录

 

 

 

 

 

抱歉!评论已关闭.