【Shared Pool】使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool
當系統在載入PL/SQL大物件時,有可能遭遇由於Shared Pool中存在大量碎片導致沒有足夠空間載入的問題。
我們可以將那些經常被使用的PL/SQL大物件預先儲存到Shared Pool中,防止載入失敗以及經常被換出,提高系統執行效率。
1.建立儲存過程初始化測試環境
這裡使用文章《【PL/SQL】向表中插入連續數字之PL/SQL方法》(http://space.itpub.net/519536/viewspace-696181)中提供的方法建立一個簡單的儲存過程用於測試。
注:實際生產環境中,該方法用於儲存PL/SQL大物件,而非本例中給出的樣例儲存過程。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create or replace procedure p_insert
2 is
3 begin
4 for i in 1..10 loop
5 insert into t values(i);
6 end loop;
7 commit;
8 end;
9 /
Procedure created.
2.建立DBMS_SHARED_POOL包
系統預設情況下不會建立dbms_shared_pool這個包。我們可以使用dbmspool.sql指令碼進行手工建立。
1)驗證預設情況下DBMS_SHARED_POOL包未建立
sys@ora10g> desc dbms_shared_pool
ERROR:
ORA-04043: object dbms_shared_pool does not exist
2)執行建立DBMS_SHARED_POOL包指令碼
sys@ora10g> @?/rdbms/admin/dbmspool.sql
Package created.
Grant succeeded.
View created.
Package body created.
3)檢視建立成功的DBMS_SHARED_POOL包
sys@ora10g> desc dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
THRESHOLD_SIZE NUMBER IN
PROCEDURE KEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
PROCEDURE SIZES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MINSIZE NUMBER IN
PROCEDURE UNKEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
我們這裡關注DBMS_SHARED_POOL包中的KEEP和UNKEEP方法。
3.使用DBMS_SHARED_POOL包將儲存過程儲存到Shared Pool
1)確認儲存過程P_INSERT是否被儲存到Shared Pool
可以透過查詢v$db_object_cache檢視獲得這方面的資訊。
sys@ora10g> col owner for a10;
sys@ora10g> col name for a30;
sys@ora10g> col kept for a4
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
最後一列KEPT表明儲存過程P_INSERT此時沒有被儲存到Shared Pool。
2)儲存儲存過程P_INSERT到Shared Pool
由於儲存過程p_insert是建立在sec使用者下,我們可以使用如下方法將該儲存過程儲存到Shared Pool中。
sys@ora10g> exec dbms_shared_pool.keep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
3)在此確認儲存過程P_INSERT是否被儲存到Shared Pool
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE YES
最後一列KEPT表明儲存過程P_INSERT此時已被儲存到Shared Pool。
4.使用DBMS_SHARED_POOL包解除Shared Pool中儲存的儲存過程
我們這裡使用UNKEEP方法可以解除Shared Pool中儲存的儲存過程。
sys@ora10g> exec dbms_shared_pool.unkeep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
解除成功。
5.10g官方文件中關於DBMS_SHARED_POOL包的描述
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_shpool.htm#ARPLS055
6.小結
本文給出了使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool的方法。
DBMS_SHARED_POOL包除了可以實現儲存儲存過程到Shared Pool外,還可以儲存其他資料庫物件,例如SQL語句、Package、Function、Type、Trigger、Sequence等,具體用法和介紹參見官方文件。
Good luck.
secooler
11.05.24
-- The End --
我們可以將那些經常被使用的PL/SQL大物件預先儲存到Shared Pool中,防止載入失敗以及經常被換出,提高系統執行效率。
1.建立儲存過程初始化測試環境
這裡使用文章《【PL/SQL】向表中插入連續數字之PL/SQL方法》(http://space.itpub.net/519536/viewspace-696181)中提供的方法建立一個簡單的儲存過程用於測試。
注:實際生產環境中,該方法用於儲存PL/SQL大物件,而非本例中給出的樣例儲存過程。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create or replace procedure p_insert
2 is
3 begin
4 for i in 1..10 loop
5 insert into t values(i);
6 end loop;
7 commit;
8 end;
9 /
Procedure created.
2.建立DBMS_SHARED_POOL包
系統預設情況下不會建立dbms_shared_pool這個包。我們可以使用dbmspool.sql指令碼進行手工建立。
1)驗證預設情況下DBMS_SHARED_POOL包未建立
sys@ora10g> desc dbms_shared_pool
ERROR:
ORA-04043: object dbms_shared_pool does not exist
2)執行建立DBMS_SHARED_POOL包指令碼
sys@ora10g> @?/rdbms/admin/dbmspool.sql
Package created.
Grant succeeded.
View created.
Package body created.
3)檢視建立成功的DBMS_SHARED_POOL包
sys@ora10g> desc dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
THRESHOLD_SIZE NUMBER IN
PROCEDURE KEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
PROCEDURE SIZES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MINSIZE NUMBER IN
PROCEDURE UNKEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
我們這裡關注DBMS_SHARED_POOL包中的KEEP和UNKEEP方法。
3.使用DBMS_SHARED_POOL包將儲存過程儲存到Shared Pool
1)確認儲存過程P_INSERT是否被儲存到Shared Pool
可以透過查詢v$db_object_cache檢視獲得這方面的資訊。
sys@ora10g> col owner for a10;
sys@ora10g> col name for a30;
sys@ora10g> col kept for a4
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
最後一列KEPT表明儲存過程P_INSERT此時沒有被儲存到Shared Pool。
2)儲存儲存過程P_INSERT到Shared Pool
由於儲存過程p_insert是建立在sec使用者下,我們可以使用如下方法將該儲存過程儲存到Shared Pool中。
sys@ora10g> exec dbms_shared_pool.keep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
3)在此確認儲存過程P_INSERT是否被儲存到Shared Pool
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE YES
最後一列KEPT表明儲存過程P_INSERT此時已被儲存到Shared Pool。
4.使用DBMS_SHARED_POOL包解除Shared Pool中儲存的儲存過程
我們這裡使用UNKEEP方法可以解除Shared Pool中儲存的儲存過程。
sys@ora10g> exec dbms_shared_pool.unkeep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
解除成功。
5.10g官方文件中關於DBMS_SHARED_POOL包的描述
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_shpool.htm#ARPLS055
6.小結
本文給出了使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool的方法。
DBMS_SHARED_POOL包除了可以實現儲存儲存過程到Shared Pool外,還可以儲存其他資料庫物件,例如SQL語句、Package、Function、Type、Trigger、Sequence等,具體用法和介紹參見官方文件。
Good luck.
secooler
11.05.24
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-696189/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- Oracle基礎包之DBMS_SHARED_POOL(十)Oracle
- 共享池 shared pool
- Oracle Shared Pool Memory ManagementOracle
- [20200212]使用DBMS_SHARED_POOL.MARKHOT標識熱物件.txt物件
- [20200126]使用DBMS_SHARED_POOL.MARKHOT與sql語句.txtSQL
- [20210708]使用那個shared pool latch.txt
- [20200213]使用DBMS_SHARED_POOL.MARKHOT標識熱物件2.txt物件
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql語句3.txtSQL
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql語句2.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句5.txtSQL
- [20201117]使用DBMS_SHARED_POOL.MARKHOT與sql語句6.txtSQL
- [20210803]使用那個shared pool latch(補充).txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與sql的計算2.txtSQL
- [20200211]使用DBMS_SHARED_POOL.MARKHOT與sql_id的計算.txtSQL
- [20200213]使用DBMS_SHARED_POOL.MARKHOT的總結.txt
- [20190102]DBMS_SHARED_POOL.MARKHOT與表.txt
- [20191219]shared_pool_size設定躍變.txt
- [20220419]19c _enable_shared_pool_durations.txt
- [20200217]使用snapper探究DBMS_SHARED_POOL.MARKHOT標識熱物件的等待事件.txtAPP物件事件
- [20220406]使用那個shared pool latch的疑問1.txt
- [20220412]shared pool latch與使用sga heap的疑問2.txt
- [20220413]shared pool latch與使用sga heap的疑問3.txt
- [20200212]使用DBMS_SHARED_POOL.MARKHOT與檢視v$open_cursor.txt
- [20190319]shared pool latch與library cache latch的簡單探究.txt
- [20210512]shared pool latch與library cache latch的簡單探究.txt
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- 透過案例學調優之--和 SHARED POOL 相關的主要 Latch
- SHARED POOL中KGH: NOACCESS佔用大量記憶體的問題分析記憶體
- [20210520]11g shared pool latch與library cache mutex的簡單探究.txtMutex
- [20210521]11g shared pool latch與library cache mutex的簡單探究4.txtMutex
- [20210520]11g shared pool latch與library cache mutex的簡單探究3.txtMutex
- Random.Shared.Next 使用random
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- large pool
- Serverless 使用阿里雲OOS將http檔案轉存到物件儲存Server阿里HTTP物件
- golang work poolGolang
- Hystrix Thread Pool 解析thread
- DUBBO Thread pool is EXHAUSTED!thread