[20180102]11g的V$SORT_USAGE视图.txt

[20180102]11g的V$SORT_USAGE视图.txt

--//当出现排序使用临时表空间的情况时,查询V$SORT_USAGE那个会话使用,但是执行的sql语句不一定是问题语句,通过例子说明.

1.环境:
SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.测试:

--//session 1:
SCOTT@book> @ &r/spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
       274          5 16928                    DEDICATED 16929       21          3 alter system kill session '274,5' immediate;

SCOTT@book> select wmsys.wm_concat(dname) c60 from dept;
C60
------------------------------------------------------------
ACCOUNTING,RESEARCH,SALES,OPERATIONS
--//注:11G定义wmsys.wm_concat的返回lob类型,使用临时表空间.

--//session 2:
SCOTT@book> select * from GV$SORT_USAGE;

INST_ID USERNAME USER  SESSION_ADDR     SESSION_NUM SQLADDR             SQLHASH SQL_ID        TABLESPACE CONTENTS  SEGTYPE     SEGFILE#    SEGBLK#    EXTENTS     BLOCKS   SEGRFNO#
------- -------- ----- ---------------- ----------- ---------------- ---------- ------------- ---------- --------- --------- ---------- ---------- ---------- ---------- ----------
      1 SCOTT    SCOTT 000000008561FD00           5 000000007D502F70 2424055223 3905nhf87s9dr TEMP       TEMPORARY LOB_DATA         201      52864          1        128          1


SCOTT@book> @ &r/sqlid 3905nhf87s9dr
SQL_ID        SQLTEXT
------------- --------------------------------------------
3905nhf87s9dr select wmsys.wm_concat(dname) c60 from dept

--//OK,现在是对的.
--//session 1:
SCOTT@book> select sysdate from dual ;
SYSDATE
-------------------
2018-01-02 14:52:56

--//session 2:
SCOTT@book> select * from GV$SORT_USAGE;
   INST_ID USERNAME USER  SESSION_ADDR     SESSION_NUM SQLADDR             SQLHASH SQL_ID        TABLESPACE CONTENTS  SEGTYPE     SEGFILE#    SEGBLK#    EXTENTS     BLOCKS   SEGRFNO#
---------- -------- ----- ---------------- ----------- ---------------- ---------- ------------- ---------- --------- --------- ---------- ---------- ---------- ---------- ----------
         1 SCOTT    SCOTT 000000008561FD00           5 000000007C67F058  409144692 f0wzs9nc663bn TEMP       TEMPORARY LOB_DATA         201      52864          1        128          1

SCOTT@book> @ &r/sql_id f0wzs9nc663bn
SQL_ID        SQLTEXT
------------- -------------------------
f0wzs9nc663bn select sysdate from dual

--//现在看到的是select sysdate from dual语句,如果这样定位有问题语句,就存在错误.
SCOTT@book> column VIEW_DEFINITION format a140
SCOTT@book> select * from v$fixed_view_definition where VIEW_name='GV$SORT_USAGE';
VIEW_NAME                      VIEW_DEFINITION
------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------
GV$SORT_USAGE                  select x$ktsso.inst_id, username, username, ktssoses, ktssosno, prev_sql_addr, prev_hash_value, prev_sql_id, ktssotsn, decode(ktssocnt, 0, '
                                                                                                                               ~~~~~~~~~~~~
                               PERMANENT', 1, 'TEMPORARY'), decode(ktssosegt, 1, 'SORT', 2, 'HASH', 3, 'DATA', 4, 'INDEX', 5, 'LOB_DATA', 6, 'LOB_INDEX' , 'UNDEFINED'), kt
                               ssofno, ktssobno, ktssoexts, ktssoblks, ktssorfno from x$ktsso, v$session where ktssoses = v$session.saddr and ktssosno = v$session.serial#


--//可以发现GV$SORT_USAGE里面取的sql_id是v$session的prev_sql_id,如果当前正在执行,判断OK,如果过后调用其它语句,看到就是错误的语句.

--//如果看看熊工的帖子:http://www.laoxiong.net/temporary_tablespace_excessive_usage_case.html
--//x$ktsso中增加了一个字段ktssosqlid,表示该临时段真正关联的SQL.可惜即使11.2.0.4版本,oracle定义的GV$SORT_USAGE视图依旧存在问题.

select ktssosqlid from x$ktsso, v$session where ktssoses = v$session.saddr 
  and ktssosno = v$session.serial# 
  and v$session.sid=274; 
KTSSOSQLID
-------------
3905nhf87s9dr

SYS@book> @ &r/sql_id 3905nhf87s9dr
SQL_ID        SQLTEXT
------------- -------------------------------------------
3905nhf87s9dr select wmsys.wm_concat(dname) c60 from dept

--//熊工还改动视图定义,总之遇到临时表空间消耗问题,注意这个问题.
    select k.inst_id "INST_ID", 
           ktssoses "SADDR", 
           sid, 
           ktssosno "SERIAL#", 
           username "USERNAME", 
           osuser "OSUSER",  
           ktssosqlid "SQL_ID", 
           ktssotsn "TABLESPACE", 
           decode(ktssocnt, 0, 'PERMANENT', 1, 'TEMPORARY') "CONTENTS", 
           --注意在12c的v$sort_usage定义中TABLESPACE和CONTENTS已经发生变化了。 
           decode(ktssosegt, 1, 'SORT', 2, 'HASH', 3, 'DATA', 4, 'INDEX',  
              5, 'LOB_DATA', 6, 'LOB_INDEX' , 'UNDEFINED') "SEGTYPE", 
           ktssofno "SEGFILE#", 
           ktssobno "SEGBLK#", 
           ktssoexts "EXTENTS", 
           ktssoblks "BLOCKS", 
           round(ktssoblks*p.value/1024/1024, 2) "SIZE_MB", 
           ktssorfno "SEGRFNO#" 
    from x$ktsso k, v$session s,  
         (select value from v$parameter where name='db_block_size') p  
    where ktssoses = s.saddr 
      and ktssosno = s.serial#; 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2149604/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/267265/viewspace-2149604/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fieldList: this.$refs.tabTable.$refs.field ? this.$refs.tabTable.$refs.field[0].tableData : this.tableDataField || [], // 字段列表 conditionList: this.$refs.tabTable.$refs.sql ? this.$refs.tabTable.$refs.sql[0].tableData : this.tableDataSql || [], // 过滤条件 sequenceList: this.$refs.tabTable.$refs.sort ? this.$refs.tabTable.$refs.sort[0].tableData : this.tableDataSort || [], // 字段排序 queryList: this.$refs.tabTable.$refs.filter ? this.$refs.tabTable.$refs.filter[0].tableData : this.tableDataFilter || [], // 查询区 view_order: this.viewOrder, // 视图顺序 module_id: this.addEditParams.module_id, // 功能id status_id: this.addEditParams.status_id, // 状态id table_name: this.addEditParams.table_name, // 表名 bill_type_id: this.addEditParams.bill_type_id, // 单据类型id des_id: this.addEditParams.des_id ? this.addEditParams.des_id : '', // 视图模板id des_alias: this.addEditParams.des_alias ? this.addEditParams.des_alias : '', // 视图别名 resource_code: this.addEditParams.resource_code ? this.addEditParams.resource_code : '', // 资源编码 page_num: this.addEditParams.page_num ? this.addEditParams.page_num : 0, // 每页条数 is_subtotal: this.addEditParams.is_subtotal ? this.addEditParams.is_subtotal : 0, // 是否小计 }; objSub.fieldList.forEach((it) => { it.is_format = it.is_format ? 1 : 0; it.is_visible = it.is_visible ? 1 : 0; it.is_total_items = it.is_total_items ? 1 : 0; it.is_primary = it.is_primary ? 1 : 0; return it; }); 优化以上代码
最新发布
07-14
要优化以上代码,可以使用数组的 `map` 方法来遍历并修改 `fieldList` 数组中的每个对象。同时,可以使用逻辑或运算符 `||` 来简化对可能为空的变量的赋值操作。以下是优化后的代码示例: ```javascript const fieldList = this.$refs.tabTable?.$refs.field?.[0]?.tableData || this.tableDataField || []; const conditionList = this.$refs.tabTable?.$refs.sql?.[0]?.tableData || this.tableDataSql || []; const sequenceList = this.$refs.tabTable?.$refs.sort?.[0]?.tableData || this.tableDataSort || []; const queryList = this.$refs.tabTable?.$refs.filter?.[0]?.tableData || this.tableDataFilter || []; const objSub = { fieldList: fieldList.map(it => ({ ...it, is_format: it.is_format ? 1 : 0, is_visible: it.is_visible ? 1 : 0, is_total_items: it.is_total_items ? 1 : 0, is_primary: it.is_primary ? 1 : 0 })), conditionList, sequenceList, queryList, view_order: this.viewOrder, module_id: this.addEditParams.module_id, status_id: this.addEditParams.status_id, table_name: this.addEditParams.table_name, bill_type_id: this.addEditParams.bill_type_id, des_id: this.addEditParams.des_id || '', des_alias: this.addEditParams.des_alias || '', resource_code: this.addEditParams.resource_code || '', page_num: this.addEditParams.page_num || 0, is_subtotal: this.addEditParams.is_subtotal || 0 }; // 打印优化后的对象 console.log(objSub); ``` 在优化后的代码中,我们使用了可选链操作符 `?.` 来避免访问可能为空的变量时出现的错误。我们还使用了逻辑或运算符 `||` 来简化对可能为空的变量的赋值操作。对于 `fieldList` 数组,我们使用了 `map` 方法来遍历并修改每个对象的属性。最后,我们输出了优化后的 `objSub` 对象。 请注意,上述代码使用了 ES6+ 的语法,确保你的开发环境支持这些语法特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值