DBA 日常管理過程中會遇到需要把特定的sql語句的執行計劃從shared pool
中清除或者需要重新生產新的執行計劃的要求。通常的alter system flush
shared_pool;或者重新執行信息統計又會造成較大的影響,所以可以使用oracle提供的
dbms_shared_pool.purge 來清除某個特定的sql的執行計劃。
下面是關於dbms_shared_pool.purge 的官方介紹:
The syntax for the DBMS_SHARED_POOL.PURGE package is:
procere purge (name varchar2, flag char DEFAULT 'P', heaps number DEFAULT 1);
name: 指定要處理的對象的名稱,有兩種情況:
1 PL/SQL 對象 就是對象的名稱
2 SQL對象,指定 'address','hash_value' 的 SQL 游標。
標記位 flag是可選的。如果忽略了該參數,則該包默認是包,過程,函數的名稱並且忽視名稱。否則,該參數就指定一個對象類型。標記位是大小寫敏感的。
標記位代表的對象類型:
Value Kind of Object to keep
----- ----------------------
P package/procere/function
Q sequence
R trigger
T type
JS java source
JC java class
JR java resource
JD java shared data
C cursor --游標
heaps: heaps to purge. e.g if heap 0 and heap 6 are to be purged.
1<<0 | 1<<6 => hex 0x41 => decimal 65. so specify heaps=>65.
Default is 1 i.e heap 0 which means the whole object will be purged.
實驗環境 版本:11.2.0.1.0 dbms_shared_pool.purge 只能通過dba才能使用
oracle@rac1:rac1 /home/oracle>sqlplus yang/yang
SQL*Plus: Release 11.2.0.1.0 Proction on Fri Jul 8 15:32:43 2011
yang@rac1>create table yangtab (id int) ;
Table created.
yang@rac1>select * from yangtab;
no rows selected
yang@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangtab%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036 1 1
yang@rac1>exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
BEGIN dbms_shared_pool.purge('00000001736EFBB8,3337951036','C'); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_SHARED_POOL.PURGE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
yang@rac1>conn /as sysdba
Connected.
sys@rac1>create table yangt (id int);
Table created.
sys@rac1>select * from yangt;
no rows selected
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036 1 1 -- 使用普通用戶時生成的。
0000000170D9BA50 2693392179 1 1
使用dbms_shared_pool.purge 刪除第一個sql的游標。
sys@rac1> exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
PL/SQL procere successfully completed.
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%';
ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
0000000170D9BA50 2693392179 1 1
sys@rac1>exec dbms_shared_pool.purge('0000000170D9BA50,2693392179','C');
PL/SQL procere successfully completed.
sys@rac1>select address,hash_value,executions,parse_calls
2 from v$sql where sql_text like 'select * from yangt%'
no rows selected
『貳』 sqlserver 中一些常看的指標和清除緩存的方法
如何查看磁碟I/O操作信息
SET
STATISTICS
IO
ON
命令是一個
使
SQL
Server
顯示有關由
Transact-SQL
語句生成的磁碟活動量的信息。
我們在分析索引性能的時候,會非常有用。
啟用了這個屬性後,我們在執行
SQL
語句後,會收到類似如下的信息,這有利於我們分析SQL的性能:
(3999
row(s)
affected)
表
'ChargeCL'。掃描計數
1,邏輯讀取
9547
次,物理讀取
0
次,預讀
0
次,lob
邏輯讀取
0
次,lob
物理讀取
0
次,lob
預讀
0
次。
其中的
lob
邏輯讀取、lob
物理讀取、lob
預讀
這三個指標是
讀取
text、ntext、image
或大值類型
(varchar(max)、nvarchar(max)、varbinary(max))
時的指標。
而
邏輯讀取、物理讀取、預讀
是對普通數據頁的讀取。
使用
SQL
Server
Management
Studio
Standard
Reports
我們在
SQL
Server
Management
Studio
中,選擇資料庫伺服器,或者具體資料庫,或者Security
--
Logins
時,或者Management
時,Notification
Services
或者
SQL
Server
Agent
對象時候,都會看到SQL
Server
替我們提供的一些現成報表,這些報表的數據,有利於我們分析資料庫的狀態。
比如在
SQL
Server
索引基礎知識(1)---
記錄數據的基本格式
http://blog.joycode.com/ghj/archive/2008/01/02/113290.aspx
中,我們就使用數據表佔用空間的報表
具體報表可以參考以下鏈接:
SQL
Server
Management
Studio
Standard
Reports
-
Overview
http://blogs.msdn.com/buckwoody/archive/2007/10/09/sql-server-management-studio-standard-reports-overview.aspx
測試中,釋放緩存的一些方法
尤其查詢語句性能測試時,數據是否被緩存,這是測試中一個重要點。下面幾個命令幫助我們清除緩存。方便測試。
清除緩存有關的命令:
SQL
2000裡面除了dbcc
unpintable好像就沒有了
而且這個操作也不會立即釋放表內存Buffer
(DBCC
UNPINTABLE
does
not
cause
the
table
to
be
immediately
flushed
from
the
data
cache.
It
specifies
that
all
of
the
pages
for
the
table
in
the
buffer
cache
can
be
flushed
if
space
is
needed
to
read
in
a
new
page
from
disk.)
SQL
2005/2008讓DBA能夠更自由的對SQL所佔用的內存空間做處理
如:
CHECKPOINT
將當前資料庫的全部臟頁寫入磁碟。「臟頁」是已輸入緩存區高速緩存且已修改但尚未寫入磁碟的數據頁。CHECKPOINT
可創建一個檢查點,在該點保證全部臟頁都已寫入磁碟,從而在以後的恢復過程中節省時間。
DBCC
DROPCLEANBUFFERS
從緩沖池中刪除所有清除緩沖區。
DBCC
FREEPROCCACHE
從過程緩存中刪除所有元素。
DBCC
FREESYSTEMCACHE
從所有緩存中釋放所有未使用的緩存條目。SQL
Server
2005
資料庫引擎會事先在後台清理未使用的緩存條目,以使內存可用於當前條目。但是,可以使用此命令從所有緩存中手動刪除未使用的條目。
另外還可以
sp_cursor_list
查看全部游標
DBCC
OPENTRAN查看資料庫打開事務狀態等
『叄』 如何清除SQL緩存數據
先設置db_recycle_cache_size的大小
然後把你希望不緩存的segment alter table / index ... storage (buffer_pool recycle)
這個只能在segment級別上定義,沒法在sql上定義
『肆』 sql資料庫的緩存清理辦法
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
SET STATISTICS IO ON
SET STATISTICS TIME ON
『伍』 如何清除SQL SERVER緩存和釋放內存
1.打開Sql
Server
Management(企業管理器);2.打開Sql
Server實例的屬性面板;3.找到內存設置,改變其中的最大伺服器內存使用即可
。
『陸』 sql資料庫伺服器,內存佔用過大怎麼辦
SqlServer系統內存管理在沒有配置內存最大值,很多時候我們會發現運行SqlServer的系統內存往往居高不下。這是由於他對於內存使用的策略是有多少閑置的內存就佔用多少,直到內存使用慮達到系統峰值時(預留內存根據系統默認預留使用為准,至少4M),才會清除一些緩存釋放少量的內存為新的緩存騰出空間。
這些內存一般都是SqlServer運行時候用作緩存的,例如你運行一個select語句,執行個存儲過程,調用函數;
1.數據緩存:執行個查詢語句,SqlServer會將相關的數據頁(SqlServer操作的數據都是以頁為單位的)載入到內存中來,下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,SqlServer需要先二進制編譯再運行,編譯後的結果也會緩存起來,再次調用時就無需再次編譯。
在我們執行完相應的查詢語句,或存儲過程,如果我們不在需要這些緩存,我可以將它清除,DBCC管理命令緩存清除如下:
--清除存儲過程緩存
DBCCFREEPROCCACHE
--註:方便記住關鍵字FREEPROCCACHE可以拆解成FREE(割捨,清除)PROC(存儲過程關鍵字簡寫),CACHE(緩存)
--清除會話緩存
DBCCFREESESSIONCACHE
--註:FREE(割捨,清除)SESSION(會話)CACHE(緩存)
--清除系統緩存
DBCCFREESYSTEMCACHE('All')
--註:FREESYSTEMCACHE
--清除所有緩存
DBCCDROPCLEANBUFFERS
--註:DROPCLEANBUFFERS
『柒』 如何清理mysql資料庫緩存數據
1、打開mysql的客戶端 這里使用navicat,連接資料庫,等到navicat主頁面,雙擊需要操作的資料庫連接。
『捌』 如何自動清理SQL資料庫在內存中的緩存
加大內存吧!360沒有這個自動清理內存的功能吧!