lYong90

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

------查看temp表空间使用情况
set linesize 1000 pagesize 5000
col EVENT for a30
SELECT *
  FROM (SELECT a.INST_ID,
               s.sid ,
               a.sql_id,
               a.TABLESPACE,
               a.USERNAME,
               s.event,
               s.status,
               a.CONTENTS,
               a.SEGTYPE,
               round(a.BLOCKS * 8 / 1024,2) size_mb
          FROM gv$sort_usage a
          left join gv$session s 
            on a.INST_ID = s.INST_ID
               and a.SESSION_ADDR = s.SADDR
          --where sid=4370
         ORDER BY a.INST_ID,a.BLOCKS DESC)
 WHERE rownum < 21;

------temp表空间使用情况
--11G下:
select tablespace_name,
       round(tablespace_size / 1024 / 1024 / 1024, 2) as total,
       round(free_space / 1024 / 1024 / 1024, 2) as free,
       round((tablespace_size - free_space) / 1024 / 1024 / 1024, 2) used_size,
       round(nvl(free_space, 0) * 100 / tablespace_size, 3) pct_free
  from dba_temp_free_space;

       
       
---10G下:
SELECT temp_used.tablespace_name,
       total - used as "Free",
       total as "Total",
       round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
  FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
          FROM GV_$TEMP_SPACE_HEADER
         GROUP BY tablespace_name) temp_used,
       (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
          FROM dba_temp_files
         GROUP BY tablespace_name) temp_total
 WHERE temp_used.tablespace_name = temp_total.tablespace_name;

set linesize 1000 pagesize 5000
col SAMPLE_TIME for a25
col SQL_ID for a15
col  PROGRAM for a30
col MACHINE for a30
select *
  from (select to_char(SAMPLE_TIME, 'yyyy-mm-dd hh24:mi:ss') SAMPLE_TIME,
               USER_ID,
               SQL_ID,
               PROGRAM,
               MACHINE,
               sum(TEMP_SPACE_ALLOCATED) / 1024 / 1024 / 1024 size_gb
          from V$ACTIVE_SESSION_HISTORY
         where SAMPLE_TIME > sysdate - 2 / 24
         group by to_char(SAMPLE_TIME, 'yyyy-mm-dd hh24:mi:ss') ,
                  USER_ID,
                  SQL_ID,
                  PROGRAM,
                  MACHINE)
 where size_gb > 1
 order by SAMPLE_TIME;




-----查看会话打开的游标
SELECT a.SQL_ID, a.SORTS, a.ROWS_PROCESSED / a.EXECUTIONS
  FROM gv$sql a
  join gv$open_cursor b
    on a.INST_ID = b.INST_ID
       and a.sql_id = b.sql_id
 WHERE a.PARSING_SCHEMA_NAME = 'ADMIN'
       AND a.EXECUTIONS > 0
       AND a.SORTS > 0
       AND b.sid = '5138'
 ORDER BY 3;



--------改良一下v$sort_usage    11.2.0.2及以上
set linesize 1000 pagesize 500
col OSUSER for a15
col USERNAME for a15
col TABLESPACE for a15
col  CONTENTS for a15
col SEGTYPE for a15
select *
  from (SELECT k.INST_ID,
               k.KTSSOSES SADDR,
               s.SID,
               s.status,
               k.KTSSOSNO SERIAL#,
               s.USERNAME,
               s.OSUSER,
               k.KTSSOSQLID sql_id,
               k.KTSSOTSN tablespace,
               decode(k.KTSSOCNT, 0, 'PERMANENT', 1, 'TEMPORARY') contents,
               decode(k.KTSSOSEGT,
                      1,
                      'SORT',
                      2,
                      'HASH',
                      3,
                      'DATA',
                      4,
                      'INDEX',
                      5,
                      'LOB_DATA',
                      6,
                      'LOB_INDEX',
                      'UNDEFINED') segtype,
               k.KTSSOFNO,
               k.KTSSOBNO,
               k.KTSSOEXTS,
               k.KTSSOBLKS,
               round(k.KTSSOBLKS * p.value / 1024 / 1024, 2) size_Mb,
               k.KTSSOFNO segrfno#
          FROM x$ktsso k,
               gv$session s,
               (SELECT VALUE
                  FROM v$parameter a
                 WHERE a.NAME = 'db_block_size') p
         WHERE k.KTSSOSES = s.SADDR
           AND k.KTSSOSNO = s.SERIAL#
           and k.INST_ID=s.INST_ID
           /*and USERNAME in ('UIMPDB',
                            'IWEB',
                            'ADMIN',
                            'ZQ_CYYW',
                            'HKJTCY_HOSTING_ADMIN',
                            'PORTA',
                            'hkjtcy_aepemcdb',
                            'hkjtcy_bfmdb',
                            'hkjtcy_bfmsso',
                            'HKJTCY_AEPSTATDB',
                            'HKJTCY_REPORT')*/
         order by size_Mb desc)
 where rownum < 21;
----SEGTYPE列的不同的值各有什么意义:
SORT:SQL排序使用的临时段,包括order bygroup byuniondistinct、窗口函数(window function)、建索引等产生的排序。
DATA:临时表(Global Temporary Table)存储数据使有的段。
INDEX:临时表上建的索引使用的段。
HASH:hash算法,如hash连接所使用的临时段。
LOB_DATA和LOB_INDEX:临时LOB使用的临时段。

----根据上述的段类型,大体可以分为三类占用:
1、SQL语句排序、HASH JOIN占用
2、临时表占用
3、临时LOB对象占用



--------------------------采集temp使用问题
create or replace procedure proc_ly_temp_message is
  V_ERROR VARCHAR2(4000);
  V_SQL   VARCHAR2(4000);
  V_DELETE   VARCHAR2(4000);

  /*
  --20160405 修改脚本中计算used_percent ,增加 *100
  create table xjmon.ly_t_collect_error
(
  hostname        VARCHAR2(50),
  instance_name   VARCHAR2(50),
  log_date        DATE,
  tablespace_name VARCHAR2(200),
  temp_total_mb   NUMBER,
  temp_used_mb    NUMBER,
  temp_free_mb    NUMBER,
  used_percent    NUMBER,
  partition_id    NUMBER,
  beizhu          VARCHAR2(4000)
) tablespace IT_XINJU;
create table xjmon.LY_T_TEMP_MESSAGE
(
  collect_date DATE,
  inst_id      NUMBER,
  sid          NUMBER,
  sql_id       VARCHAR2(13),
  tablespace   VARCHAR2(31),
  username     VARCHAR2(30),
  event        VARCHAR2(64),
  status       VARCHAR2(8),
  contents     VARCHAR2(9),
  segtype      VARCHAR2(9),
  size_mb      NUMBER
) tablespace IT_XINJU;
create index xjmon.ind_TEMP_MESSAGE_date on  xjmon.LY_T_TEMP_MESSAGE(collect_date)  tablespace IT_XINJU;
  */

begin
  V_SQL := 'insert into xjmon.ly_t_temp_message
    SELECT *
  FROM (SELECT sysdate collect_date,
               a.INST_ID,
               s.sid,
               a.sql_id,
               a.TABLESPACE,
               a.USERNAME,
               s.event,
               s.status,
               a.CONTENTS,
               a.SEGTYPE,
               round(a.BLOCKS * 8 / 1024, 2) size_mb
          FROM gv$sort_usage a
          left join gv$session s
            on a.INST_ID = s.INST_ID
               and a.SESSION_ADDR = s.SADDR
         ORDER BY a.INST_ID, a.BLOCKS DESC)
 WHERE rownum < 21 and size_mb>500';
 V_DELETE := 'delete from xjmon.ly_t_temp_message where collect_date<sysdate-10';
  ------
  BEGIN
    EXECUTE IMMEDIATE V_SQL;
    EXECUTE IMMEDIATE v_delete;
    COMMIT;
  EXCEPTION
    WHEN OTHERS THEN
      V_ERROR := SUBSTR(SQLERRM, 1, 2500);
      INSERT INTO xjmon.ly_t_collect_error
        (LOG_DATE, BEIZHU, partition_id)
      VALUES
        (SYSDATE, V_ERROR, to_number(to_char(sysdate, 'dd')));
      COMMIT;
  END;
end;
/



DECLARE
  JOBS INT;
BEGIN

  SYS.DBMS_JOB.SUBMIT(JOB       => JOBS,
                      WHAT      => 'PROC_LY_TEMP_MESSAGE;',
                      NEXT_DATE => TO_DATE('2016-07-15 08:17:00',
                                           'YYYY-MM-DD HH24:MI:SS'),
                      INTERVAL  => 'SYSDATE+1/(24*60*60)');
  COMMIT;
END;
/


-----------------11g查询历史temp消耗较高的语句
select instance_number, username, sql_id, count(*), max(size_gb)
  from (select to_char(a.sample_time, 'yyyy-mm-dd hh24:mi:ss') sample_time,
               a.instance_number,
               b.username,
               a.sql_id,
               a.temp_space_allocated / 1024 / 1024 / 1024 size_gb
          from dba_hist_active_sess_history a, dba_users b
         where a.sample_time > sysdate - 5
               and a.user_id = b.user_id
               --and a.instance_number = 3
               )
 where size_gb > 10
 group by instance_number, username, sql_id;
 
set linesize 1000 pagesize 5000
select *
  from (select to_char(a.sample_time, 'yyyy-mm-dd hh24:mi:ss') sample_time,
               a.INST_ID,
               b.username,
               a.sql_id,
               a.temp_space_allocated / 1024 / 1024 / 1024 size_gb
          from gV$active_session_history a, dba_users b
         where a.sample_time > sysdate - 2
               and a.user_id = b.user_id)
 where size_gb > 10
 order by sample_time, INST_ID;

 

posted on 2018-08-15 14:49  lYong90  阅读(730)  评论(0编辑  收藏  举报