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没有这个自动清理内存的功能吧!