Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

55

积分

0

好友

2

主题
1#
发表于 2013-7-15 22:05:56 | 查看: 5037| 回复: 3
v$sql中的module由于记录第一次解析时的信息,所以执行相同的SQL计算更改module,其记录在v$sql的值不变化,这里我测试用dbms_shared_pool.purge清除游标信息,但最终结果显示module值还是原来的信息(测试相隔时间久一点是可以清除),
请问如何手动清理单条sql的module信息?

以下是测试过程,环境:RHEL5.2 + ORACLE 10.2.0.4.0 - 64bit
  1. sqlplus / as sysdba

  2. SQL*Plus: Release 10.2.0.4.0 - Production on D??úò? 7?? 15 21:20:38 2013

  3. Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


  4. Connected to:
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
  6. With the Partitioning, Oracle Label Security, OLAP, Data Mining,
  7. Oracle Database Vault and Real Application Testing options

  8. SQL> alter system flush shared_pool;

  9. System altered.

  10. SQL> set wrap off
  11. SQL> set linesize 190
  12. SQL> col sql_id format a15
  13. SQL> col module format a15
  14. SQL> col action format a15
  15. SQL> col sql_text format a100
  16. SQL> select sql_id, address, hash_value, executions, module, action, sql_text
  17.   2    from v$$sqlarea
  18.   3   where module like 's_o_m_test%';

  19. no rows selected

  20. SQL> declare
  21.   2    v_int varchar(50);
  22.   3  BEGIN
  23.   4    DBMS_APPLICATION_INFO.set_module(module_name => 's_o_m_test123',
  24.                                    action_name => 'select module');
  25.   6      select /* s_o_m */ 1 into v_int from dual;
  26.   7  END;
  27.   8  /

  28. PL/SQL procedure successfully completed.

  29. SQL> select sql_id, address, hash_value, executions, module, action, sql_text
  30.   2    from v$$sqlarea
  31.   3   where module like 's_o_m_test%';

  32. SQL_ID          ADDRESS          HASH_VALUE EXECUTIONS MODULE          ACTION          SQL_TEXT
  33. --------------- ---------------- ---------- ---------- --------------- --------------- ----------------------------------------------------------------------------------------------------
  34. bunvx480ynf57   0000000090F3D3F8   32127143          1 s_o_m_test123   select module   SELECT 1 FROM DUAL

  35. SQL> alter session set events '5614566 trace name context forever';

  36. Session altered.

  37. SQL> exec dbms_shared_pool.purge('0000000090F3D3F8,32127143','C',1);

  38. PL/SQL procedure successfully completed.


  39. ----这里看到以上sql游标已经清除了...
  40. SQL> select sql_id, address, hash_value, executions, module, action, sql_text
  41.   2    from v$$sqlarea
  42.   3   where module like 's_o_m_test%';

  43. SQL_ID          ADDRESS          HASH_VALUE EXECUTIONS MODULE          ACTION          SQL_TEXT
  44. --------------- ---------------- ---------- ---------- --------------- --------------- ----------------------------------------------------------------------------------------------------
  45. 39q0s0jmf7ggm   0000000097F76E38 1726201331          1 s_o_m_test123   select module   SELECT VSIZE(KGLHDADR) FROM X$$KGLOB WHERE ROWNUM < 2
  46. ak92r5092znk7   000000008F5484F8  305123911          1 s_o_m_test123   select module   BEGIN dbms_shared_pool.purge('0000000090F3D3F8,32127143','C',1); END;

  47. SQL> declare
  48.   2    v_int varchar(50);
  49.   3  BEGIN
  50.   4    DBMS_APPLICATION_INFO.set_module(module_name => 's_o_m_test369',
  51.                                    action_name => 'select module 1');
  52.     select /* s_o_m */ 1 into v_int from dual;
  53.   7  END;  
  54.   8  /

  55. PL/SQL procedure successfully completed.

  56. ----再次执行相同sql,手动指定module_name,其module信息显示第一次指定的值,而 EXECUTIONS 是1,...
  57. SQL> select sql_id, address, hash_value, executions, module, action, sql_text
  58.   2    from v$$sqlarea
  59.   3   where module like 's_o_m_test%';

  60. SQL_ID          ADDRESS          HASH_VALUE EXECUTIONS MODULE          ACTION          SQL_TEXT
  61. --------------- ---------------- ---------- ---------- --------------- --------------- ----------------------------------------------------------------------------------------------------
  62. bunvx480ynf57   0000000090F3D3F8   32127143          1 s_o_m_test123   select module   SELECT 1 FROM DUAL
  63. 39q0s0jmf7ggm   0000000097F76E38 1726201331          1 s_o_m_test123   select module   SELECT VSIZE(KGLHDADR) FROM X$$KGLOB WHERE ROWNUM < 2
  64. 11yqk8j033gpq   000000008B4BD2A8 1077001910          1 s_o_m_test123   select module   declare   v_int varchar(50); BEGIN   DBMS_APPLICATION_INFO.set_module(module_name => 's_o_m_test369'
  65. ak92r5092znk7   000000008F5484F8  305123911          1 s_o_m_test123   select module   BEGIN dbms_shared_pool.purge('0000000090F3D3F8,32127143','C',1); END;
复制代码
2#
发表于 2013-7-16 15:35:51
弱弱的问一句,你清理这个干什么呢?

回复 只看该作者 道具 举报

3#
发表于 2013-7-16 16:10:36
DBMS_APPLICATION_INFO.set_module
这个东西,如果两个module执行同一个sql,那么会把相关信息记录到第一个执行的中去。
想要不一样,只能让sql有点变化才行。
我测试时是这样的。不知道其他人什么意见。

回复 只看该作者 道具 举报

4#
发表于 2013-7-16 18:49:14
我的dbms_shared_pool怎么没有这个方法purge

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 20:54 , Processed in 0.047107 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569