11G can flush one SQL Cursor out of shared pool

[复制链接]
查看11 | 回复4 | 2010-10-8 09:28:51 | 显示全部楼层 |阅读模式
在11G之前(准确的说在10204之前),当我们需要flush一些literal SQL out of shared pool时,我们马上想到的是对于这个SQL所在的object上做一些DDL使其马上被flush出shared pool。例如:
under 10G:
SQL> select ADDRESS,HASH_VALUE,EXECUTIONS from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
ADDRESS
HASH_VALUE EXECUTIONS
---------------- ---------- ----------
00000003ADA4FFB8 4184050671
2

SQL> grant select on testsqlsql to dba;
Grant succeeded.

SQL> select ADDRESS,HASH_VALUE,EXECUTIONS from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
no rows selected

但是11G开始这招不灵了。
做DDL只是将这个objects相关的SQL标志为INVALID,然后下次执行时才被清除。

under 11G:
SQL> select ADDRESS,HASH_VALUE,EXECUTIONS,SHARABLE_MEM,OBJECT_STATUS
2from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
ADDRESS
HASH_VALUE EXECUTIONS SHARABLE_MEM OBJECT_STATUS
---------------- ---------- ---------- ------------ -------------------
000000039FCBEBE0 4184050671
114656 VALID
SQL> grant select on testsqlsql to dba;
Grant succeeded.
SQL> select ADDRESS,HASH_VALUE,EXECUTIONS,SHARABLE_MEM,OBJECT_STATUS
2from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
ADDRESS
HASH_VALUE EXECUTIONS SHARABLE_MEM OBJECT_STATUS
---------------- ---------- ---------- ------------ -------------------
000000039FCBEBE0 4184050671
114656 INVALID_UNAUTH

一般情况下是没问题的,但是如果我们希望flush一些literal SQL或者占用shared pool非常之大的SQL,而且希望他们马上消失,这时我们需要其他的办法。
就是11G的dbms_shared_pool.purge。(准确的说10204就有了,只是有一些bug)。

PROCEDURE PURGE
Argument Name
Type
In/Out Default?
------------------------------ ----------------------- ------ --------
NAME
VARCHAR2
IN
FLAG
CHAR
IN DEFAULT
HEAPS
NUMBER
IN DEFAULT

如果对于SQL cursor来说,NAME参数的格式是ADDR,HASH_VALUE from v$sqlarea。
FLAG参数标明了NAME参数的种类,对于SQL Cursor来说,FLAG只要不为'P' or 'p' or 'Q' or 'q' or 'R' or 'r' or 'T' or 't'即可。所以在其他的文章中,为了flush一个SQL Cursor,FLAG常被设为'C',其实设为其他任何字母都没问题。
HEAPS参数为1代表所有heaps都被purge。即:

SQL> select ADDRESS,HASH_VALUE,EXECUTIONS,SHARABLE_MEM,OBJECT_STATUS
2from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
ADDRESS
HASH_VALUE EXECUTIONS SHARABLE_MEM OBJECT_STATUS
---------------- ---------- ---------- ------------ -------------------
000000039FCBEBE0 4184050671
114656 INVALID_UNAUTH

SQL> exec sys.dbms_shared_pool.purge('000000039FCBEBE0,4184050671','C',1);
PL/SQL procedure successfully completed.

SQL> select ADDRESS,HASH_VALUE,EXECUTIONS,SHARABLE_MEM,OBJECT_STATUS
2from v$sqlarea where SQL_TEXT like 'select count(*) from testsqlsql%';
no rows selected



回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
10204也可以purge,只不过在11g中更完善了一些了。
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
good
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
10G上用过还可以,你遇到过什么bug吗?
回复

使用道具 举报

千问 | 2010-10-8 09:28:51 | 显示全部楼层
some times in 11202 it doesn't work.
SYS@ : SQL>exec sys.dbms_shared_pool.purge('00000017030BF580,3871470555','C',65);
PL/SQL procedure successfully completed.
SYS@ : SQL> select ADDRESS,HASH_VALUE,EXECUTIONS,SHARABLE_MEM,OBJECT_STATUS,version_countfrom v$sqlarea where version_count>500;
ADDRESS
HASH_VALUE EXECUTIONS SHARABLE_MEM OBJECT_STATUS VERSION_COUNT
---------------- ---------- ---------- ------------ ------------------- -------------
000000171B7F4020 2964747843 4994 22783987 VALID
672
000000171A19F3D8 1933375714 2000 24813602 VALID
540
0000001703BC3918 2388344367 2686 24333992 VALID
581
000000171760D2E0 3778111096 1807 26706267 INVALID_UNAUTH
534
000000170B5FC6D8 3942893605 3869 25483492 INVALID_UNAUTH
672
00000017030BF580 3871470555 2111 22816233 INVALID_UNAUTH
545
6 rows selected.
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行