如何监控ORACLE索引使用与否在数据库管理与维护中,我们总会遇到一个问题:我们创建的索引是否会被某些SQL语句使用呢?换个通俗表达方式:我创建的索引是否是未使用的索引(unused Indexes),是否有价值呢?如果创建的某个索引是Unused Indexes,尤其是没有合理规划索引的系统或那些管理控制不规范的系统 。有可能建立了N个索引,其实有些索引都是没有任何SQL会使用,那么此时这些多余的索引其实会带来两个问题:1:浪费存储空间,尤其是大表的索引,浪费的存储空间尤其可观; 2:加重DML操作(UPDATE、INSERT、DELETE)的开销 。
ORACLE其实提供了监控索引使用情况的功能 。ALTER INDEX index_name MONITORING USAGE; 我们下面来测试验证一下吧 。
创建一个表TEST作为实验测试验证的样例
CREATE TABLE TEST
(
IDNUMBER(10),
NAMEVARCHAR2(32)
);
CREATE INDEX IDX_TEST_ID ON TEST(ID);
INSERT INTO TEST
SELECT 1001, 'Kerry' FROM DUAL UNION ALL
SELECT 1002, 'Ken'FROM DUAL UNION ALL
SELECT 1003, 'Jimmy' FROM DUAL UNION ALL
SELECT 1004, 'Jack'FROM DUAL;
COMMIT;
execute dbms_stats.gather_table_stats(ownname = 'ETL', tabname ='TEST', estimate_percent =DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt = 'FOR ALL COLUMNS SIZE AUTO');启用对索引IDX_TEST_ID的监控
ALTER INDEX IDX_TEST_ID MONITORING USAGE;此时观察V$OBJECT_USAGE表数据的变化 , 如下所示 , MONITORIN字段值变为YES , 表示索引IDX_TEST_ID已经被置于监控状态 。USED字段为NO表示暂时没有SQL使用该索引SQL COL INDEX_NAME FOR A20
SQL COL TABLE_NAME FOR A10
SQL COL MONITORING FOR A10
SQL COL USED FOR A10
SQL COL START_MONITORING FOR A20
SQL COL END_MONITORING FOR A20
SQL SELECT * FROM V$OBJECT_USAGE;
INDEX_NAMETABLE_NAME MONITORING USEDSTART_MONITORINGEND_MONITORING------------ ---------- ---------- ---- -------------------- ----------------IDX_TEST_IDTESTYESNO11/28/2015 14:57:41此时我们执行下面SQL , 因为此时使用全表扫描,那么索引IDX_TEST_ID依然没有被使用,此时可以查看V$OBJECT_USAGE进行验证 。
SQL SET AUTOTRACE ON;
SQL SELECT * FROM TEST WHERE ID =1001;
ID NAME
---------- --------------------------------1001 Kerry
Execution Plan
--------------------------------------------------------------------------------------------------------------------| Id| Operation| Name | Rows| Bytes | Cost|----------------------------------------------------------|0 | SELECT STATEMENT||1 |9 |2 ||1 |TABLE ACCESS FULL| TEST |1 |9 |2 |----------------------------------------------------------Note
-----
- 'PLAN_TABLE' is old version
Statistics
----------------------------------------------------------1recursive calls
0db block gets
4consistent gets
0physical reads
0redo size
578bytes sent via SQL*Net to client
492bytes received via SQL*Net from client2SQL*Net roundtrips to/from client
0sorts (memory)
0sorts (disk)
1rows processed
clip_image001
如下所示 , 此时索引IDX_TEST_ID依然没有被使用 。
clip_image002
我们使用索引提示强制下面SQL使用索引IDX_TEST_IDSELECT /*INDEX(TEST IDX_TEST_ID) */* FROM TEST WHERE ID =1001;此时你就会发现USED的值变为了YES了 。
clip_image003
ALTER INDEX IDX_TEST_ID NOMONITORING USAGE;执行上面命令后,在V$OBJECT_USAGE表中,就会更新表TEST记录的END_MONITORING、MONITORING的值 。
clip_image004
如果你又启用监控索引使用情况,那么系统会更新START_MONITORING、END_MONITORING字段的值(END_MONITORING的值更新为NULL) 。如果删除表TEST , 此时你会发现V$OBJECT_USAGE对象中关于表TEST的记录也不见了 。
注意:SELECT * FROM V$OBJECT_USAGE; 只能查看当前用户下被监控的索引信息 。即使sys、system用户也不能查看其它用户的信息 。
在测试过程中有个小疑问,就是在准备测试环境时 , 如果不对表收集统计信息的话,那么即使SQL走全表扫描,你依然发现V$OBJECT_USAGE中索引被标记使用了 。如下所示DROP TABLE TEST PURGE;
CREATE TABLE TEST
(
IDNUMBER(10),
NAMEVARCHAR2(32)
);
CREATE INDEX IDX_TEST_ID ON TEST(ID);
INSERT INTO TEST
SELECT 1001, 'Kerry' FROM DUAL UNION ALL
SELECT 1002, 'Ken'FROM DUAL UNION ALL
SELECT 1003, 'Jimmy' FROM DUAL UNION ALL
SELECT 1004, 'Jack'FROM DUAL;
COMMIT;
ALTER INDEX IDX_TEST_ID MONITORING USAGE;SQL SET AUTOTRACE ON;
SQL SELECT *FROM TEST WHERE ID =1001;
ID NAME
---------- --------------------------------1001 Kerry
Execution Plan
--------------------------------------------------------------------------------------------------------------------| Id| Operation| Name | Rows| Bytes | Cost|----------------------------------------------------------|0 | SELECT STATEMENT||1 |31 |2 ||1 |TABLE ACCESS FULL| TEST |1 |31 |2 |----------------------------------------------------------Note
-----
- 'PLAN_TABLE' is old version
Statistics
----------------------------------------------------------7recursive calls
0db block gets
10consistent gets
0physical reads
0redo size
578bytes sent via SQL*Net to client
492bytes received via SQL*Net from client2SQL*Net roundtrips to/from client
0sorts (memory)
0sorts (disk)
1rows processed
SQL SELECT * FROM V$OBJECT_USAGE;
INDEX_NAMETABLE_NAME MONITORING USEDSTART_MONITORINGEND_MONITORING------------ ---------- ---------- ------------------------------------IDX_TEST_IDTESTYESYES11/28/2015 15:11:46那么为什么呢? 猜测是在解析生成执行计划时,用到了索引的一些信息,导致V$OBJECT_USAGE表中的字段USED被标记为YES 。
如果我们想在系统中监控所有的索引,那么我们可以通过下面脚本实现监控数据库所有的索引 。注意我们要排除一些系统表的索引、以及LOB indexes 。原因有下面两个:
1:LOB indexes不能修改,否则会报ORA-22864错误(ORA-22864: cannot ALTER or DROP LOB indexes) 。
2:ORA-00701: object necessary for warmstarting database cannot be alteredORA-00701: object necessary for warmstarting database cannot be altered00701. 00000 - "object necessary for warmstarting database cannot be altered"*Cause: Attempt to alter or drop a database object (table, cluster, orindex) which are needed for warmstarting the database.
*Action: None.
SET PAGES 999;
SET HEADING OFF;
SPOOL run_monitor.sql
SELECT
'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' MONITORING USAGE;'
FROM
DBA_INDEXES
WHERE
INDEX_TYPE != 'LOB' AND OWNER NOT IN('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN');
SPOOL OFF;
@run_monitor.sql
此时使用下面脚本就能查出那些索引是未使用索引,当然监控索引时长非常重要,太短的话有可能导致查询出来的数据有问题 , 一般建议监控一周后即可,OLAP系统则需要适当延长监控的时间 。
SELECT I.TABLE_OWNER,
T.TABLE_NAME,
I.INDEX_NAME,
U.USED,
U.START_MONITORING,
U.END_MONITORING
FROM USER_TABLES T
INNER JOIN USER_INDEXES I
ON T.TABLE_NAME = I.TABLE_NAME
INNER JOIN V$OBJECT_USAGE U
ON U.TABLE_NAME= I.TABLE_NAME
AND I.INDEX_NAME= U.INDEX_NAME
WHERE I.TABLE_OWNER=SYS_CONTEXT('USERENV','CURRENT_USER')另外,博客Oracle - Find unused Indexes中介绍了一个查找没有使用索引的SQL语句 。如下所示statspack_unused_indexes.sqlcol owner heading "Index Owner" format a30col index_name heading "Index Name" format a30set linesize 95 trimspool on pagesize 80
select *
from
(select
owner,
index_name
from
dba_indexes di
where
di.index_type != 'LOB'
and
owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN')minus
select
index_owner owner,
index_name
from
dba_constraints dc
where
index_owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN')minus
select
p.object_owner owner,
p.object_nameindex_name
from
stats$snapshotsn,
stats$sql_planp,
stats$sql_summaryst,
stats$sql_plan_usage spu
where
st.sql_id = spu.sql_id
and
spu.plan_hash_value = https://www.04ip.com/post/p.plan_hash_value
and
st.hash_value = https://www.04ip.com/post/p.plan_hash_value
and
sn.snap_id = st.snap_id
and
sn.dbid = st.dbid
and
sn.instance_number = st.instance_number
and
sn.snap_id = spu.snap_id
and
sn.dbid = spu.snap_id
and
sn.instance_number = spu.instance_number
and
sn.snap_id between begin_snap and end_snapand
p.object_type = 'INDEX'
)
where owner not in ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN')order by 1, 2
/
这里是另一个脚本用来跟踪未使用的索引并展示给所有索引的调用计数 。最重要的是,这个脚本显示了多列索引引用的列(这个脚本执行时间较长,资源开销较大 。)col c1 heading 'Begin|Interval|time' format a20col c2 heading 'Search Columns'format 999col c3 heading 'Invocation|Count'format 99,999,999break on c1 skip 2
accept idxname char prompt 'Enter Index Name: '
ttitle 'Invocation Counts for index|idxname'
select
to_char(sn.begin_interval_time,'yy-mm-dd hh24')c1,p.search_columnsc2,count(*)c3from
dba_hist_snapshotsn,
dba_hist_sql_planp,
dba_hist_sqlstatst
where
st.sql_id = p.sql_id
and
sn.snap_id = st.snap_id
and
p.object_name = 'idxname'
group by
begin_interval_time,search_columns;
如何监控oracle数据库的备份监控数据备份恢复完成进度(EXPDP/IMPDP/RMAN)
一、查看EXPDP/IMPDP的进度
1 两个视图
当oracle如何监控你当如导出的时候 , 如果数据量比较大,中途有些人会着急,不免想看看进度如何,利用两个视图就可以看:
DBA_DATAPUBMP_JOBS和DBA_DATAPUMP_SESSIONS视图
col owner_name for a10
col job_name for a20
col operation for a10
col job_mode for a10
col state for a20
col degree for a10
colATTACHED_SESSIONS for a30
col DATAPUMP_SESSIONS for a30
set linesize 200
格式化只是为了好看,也可以不用,直接用PL/SQL DEVELOPER图形工具 。
可以使用DBA_DATAPUBMP_JOBS和DBA_DATAPUMP_SESSIONS视图来显示数据泵取作业的信息 。
select * from DBA_DATAPUBMP_JOBS;
select * from DBA_DATAPUMP_SESSIONS;
select sid,serial# from v$session s,dba_datapump_sessions d where s.saddr=d.saddr;
补充一下 , 前面的sql命令行格式化有点问题,number型的字段应该用9999xxx(多个9) 而不是axx,否则会出现一串串的# 。
2 attach参数
1)查看任务进度
当你使用crontab后台任务运行导入导出任务的时候 , 想查看任务进度,该参数很有用 , 可以让你再次连接到已经断开的会话中,再次接管导出或导入的任务,当然你得先用前面2个视图查到jobname 。
2)中途想停止crontab后台任务
此时,该参数非常好用 。因为你不这样做 , 就得杀进程,而那么多进程 , 通常都会出错 , 如此暴利的杀进程方式,强烈滴不推荐 。
举例oracle如何监控:
假如之前后台任务的脚本中,有类似命令:
expdp system/xxxDIRECTORY=DATA_PUMP_DIR2parallel=32DUMPFILE=xxxx-\u.dmp
ATTACH参数解释:将你的数据泵取客户机会话加入到一个运行的作业中,并使你进行交互方式 。此参数只能与用户名/密码组合一起使用 。
此时你可以使用如下命令重新连接任务,并达到提前终止任务的目的:
expdp system/xxxattach=lurou.exp
连接进去之后再执行help命令可以查到停止任务的命令,这里就不列出来了
3 longops视图
另也可以通过v$session_longops视图来监控长期运行的会话 。
4.通过语句查看impdp进度SELECTa.tablespace_name,
ROUND (a.total_size) "total_size(MB)",
ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",
ROUND (b.free_size, 3) "free_size(MB)",
ROUND (b.free_size / total_size * 100, 2) || '%' free_rate
FROM
(
SELECT
tablespace_name, SUM (bytes) / 1024 / 1024 total_size
FROMdba_data_files
GROUP BY
tablespace_name) a,
(
SELECT
tablespace_name, SUM (bytes) / 1024 / 1024 free_size
FROMdba_free_space
GROUP BY
tablespace_name) b
WHERE
a.tablespace_name = b.tablespace_name( );
二、查看RMAN备份进度
另外 , 查看rman的备份进度 , 可以用如下语句,记录备忘 。
SELECT SID,OPNAME, SERIAL#, CONTEXT, SOFAR, TOTALWORK, ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"
FROM V$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN%'AND OPNAME NOT LIKE '%aggregate%'AND TOTALWORK != 0 AND SOFARTOTALWORK
order by "%_COMPLETE" desc
如何监控Oracle数据库中长时间运行的进程监控Oracle 数据库中长时间运行进程的两种方式,通过这些方 法,oracle如何监控我们可以监控单条语句的 长时间操作,监控存储过程的运行进度,甚至自己'生成'进度信息. 关键词:监控进度V$SESSION_LONGOPS 当Oracle 存储过程运行时间较长时,oracle如何监控我们希望客 户端能oracle如何监控了解到它在后台执行的状况或者进度信息(类 似WINDOWS 安装软件时的进度条信息),这样可以知 道运行在后台的应用进程是否终止或者休眠,更近一 步要求,最好能知道进行到哪一步骤,还有多少时间才 能完成. 简单到一条SQL 语句的情况,如果执行时间较长, 我们如何得到它的运行状况?是否后台还在运行?虽 然可以查看SQL 的执行计划了解它的执行步骤,但如 何知道它运行到哪一个步骤了呢?如何才能估计出它 的合理的较为精确的执行时间呢? Oracle 数据库前端发出执行命令后,进程在后台 执行,普通开发人员一般无法了解到后台在做什么,一 般采用的方法是用DBMSOUTPUT.PUT_LINE 来打印出 来,但DBMS—OUTPUT.PUT—LINE 打印的信息受缓冲区 大小限制,如果信息较多就容易溢出,而且如果存储过 程执行时间较长,只有在其执行完后,这些信息才会打 印出来,这就增加了调试周期,影响了调试效果.有的 开发人员在存储过程中通过写日志表的形式来记录进 度,但需要COMMIT 后其他进程才能看到这些日志信 息,而在某些控制结构中(如游标CURSOR 循环)COM— MIT,则很容易引起ORA 一01555 错误,造成程序出错. 下面介绍两种监控方法. 如何监控单条长语句从ORACLE8 开始,出现一个新的动态视图:V $SESSION_LONGOPS,从这个视图可以获知一些操作 (如全表扫描,并行查询,RMAN,排序等)的执行进度, 我们先来了解一下V$SESSION—LONGOPS 视图的一些 重要字段: 列说明 sID 会话标识 5ERIAL#会话序列号 OPfE 操作的简短描述 TARG 盯操作的对象,如xx TAR~_DESC目标描述 SOFAR 目前已执行单位数目 ToTAIWORK 总单位数目 UNlTS 单位 START_TIME 开始执行时间 LAST_ UPDATE_TIME 统计数据最后更新时间 TIME_ REMAINING 估计剩余时间c ELAPSED_SECONDS 已执行时间(秒) MEsSAGE 统计数据汇总信息 USERA^^E 用户名 ~L_ADDRES5 语句的地址,,用于和V$sql_text 等关联 语句的hash 地址,用于和V$sql_texlSQLHASH VALUE等关联 这个动态视图显示各个运行时间超过6 程.这些进程包含许多备份和恢复功能,统计数据收集,查询等. 执行以下语句就可以得到数据库中各个长时间操 作的进程信息: select'Icfromv$sesslon_ longopswheretime_ re- malnlng0 我们也可以用图形化工具查看,如TOAD,OEM中 均可查看长操作进程进度信息. Oracle 自带的管理工具OracleEnterpriseManager (OEM)提供了图形化查看长操作的功能,如: 计算机系统应用2007 Quest公司的数据库管理工具TOAD 也可以看到 长操作信息,如: 表的统计信息. 长时问运行的SQL 语句可以用V$SESSION—LON? 为了能监控到查询进程执行的进度,必需使用 CBO 优化器并且: 设置TlMED—STATISTICS或者SQL—TRACE 用ANALYZE语句或者DBMS—STAT 包收集相关 108 实践经验P 帕cficalExpen GOPS来监控.实际上,长时间运行的存储过程也可以 监控.那是否任何操作都可以通过这个视图来监控进 度呢?很遗憾,V$SESSION—LONGOPS 只会报告它认为 耗时长的操作.对于NEsTEDLOOP/UNIQUEINDEX READS/INDEXRANGEScANS 等执行速度很快的操作, 2007 期计算机系统应用由于它们执行一般不超过6 秒,因此将不会出现在V $SESSION—LONGOPS 如何监控自定义存储过程单条长语句可以用上面的方法监控,Oracle 动生成V$SE.SSION— LONGOPS 记录.那么存储过程中 有许多小操作,如何监控进度呢?其实,我们也可以手 工生成V$SESSION—LONGOPS 记录,方法是调用DBMS APPLICATION—INFO 包来生成自定义进度信息. 从Oracle7.2 开始,提供了DBMS—APPLICATION— INFo 包,通过调用这个包,应用可以将自己的名字和 动作填写到V$SESSION 和V$SQLAREA 的MODULE ACTION列中.V$SESSION 列出每个会话的用户名,操 作系统机器名,终端名,程序名等. 应用可以在执行模块时设置模块名和动作名,模 块名一般是甩户自定义的.而动作名一般描述模块中 的当前执行的事务的名字. DBMSAPPLICATION_INFO 包包含以下过程 SET_ MODULE 设置当前运行程序的模块名 SET__AEl'ION 设置当前模块的当前动作名 SESSION—LON-在V$SESSIONLONGOPS视图中 GoPS 插入一行进度信息 SETMODULE过程设置模块名和动作名: createorreplaceproceduredel—cust(v_cust—Id varchar2) begindbms—— application—— info.set— module(module—— name="delcust". actlon_name="deletetablecust)i deletefromcustwherecustld=v_ cusLId; dbms_appllcatlon— Info.seLmodule(,); end;以上设置的模块名和动作名可以通过查询V $sqlarea 获取. 如:selectsql—text,module,actionfromv $sqlareawheremodule="del_cust: sql_textmoduleadion Deletefr0mcustdel_ custdeletetableoust 1rowselected. SET_SESSION—LONGOPS 过程用于在V$session— longops 中插入一行,开发人员可以调用此过程设置长 时间操作的状态信息,这样,任何其他其他会话都可以 看到这个进度信息.如下例所示: declare nohlntnumberdefaultdbmsapplicatlon_info.set_ session— Iongops_ nohint; IdndexnumberdefaultInohlnt: slnonumber;begin forlIn1..8888888888 loop update....; dbms_ appllcaflon— Info.setsesslon_ longops (rlndex=l_rlndex, slno=I_slno. op_name="updateahugetable. target=126, target_desc='.msgdescription context=0.sOfar=j. totalwork=8888888888. units=loops endloop;end; 然后,从另一个会话来执行以下语句selectfromv$sesslon_ longopswheretlmere? malnlng0; 也可以用图形化工具TOAD 或OEM来查看. 因此,采用本文说明的方法,Oracle 开发人员可以 比较方便的监控长操作进程的进度信息,也可以自己 设置监控信息,来了解后台存储过程的运行效率.甚 至,可以在存储过程或SQL 语句提交执行后马上观察 其执行进度,如果比较缓慢,则可以中断其执行,进行 调优,从而缩短调试周期,提高开发效率.
如何在LoadRunner中监控oracle数据库使用LR自带oracle如何监控的监控引擎:
1oracle如何监控 , 在第一个图choose monitor engine中选择sitescopeoracle如何监控,然后在在Monitored Server Machines区域点击Add如下所示:
在这里可以选择本地或者其他机器的sitescope,如果sitescope启用了account的验证,也要写上相应的用户名密码 。
2,在Resource Measurements on:IP区域点击添加 , 弹出对话框如下:
3,输入信息如图 。点击OK,如下:
如何监控oracle数据库性能oracle的性能判断需要综合数据库的多个运行指标来判断:
1、进程数量和占用cpu:这个主要看有没有长时间占用cpu的进行 。通常会判断大出sql,需要优化;这个可以用执行计划或者awr报告查看;
2、内存占用:主要用系统命令查看ora_占用和系统总内存的比例,swap的使用率;通常swap使用率低就没事;这个主要使用系统命令;
3、磁盘占用率:防止磁盘空间不足,需要的主要在系统和用户表空间、RMAN等操作上;这个主要使用系统命令;RMAN命令查看
怎么监控oracle数据库表和表空间的现状可以通过查询v$tablespace、dba_data_files、dba_tablespaces等视图监控Oracle数据库表空间状态 。
Oracle数据库表状态可以通过查询user_tables视图进行监控,如select table_name,status from user_tables where table_name='T1';语句 。
【oracle如何监控 oracle监控软件】oracle如何监控的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于oracle监控软件、oracle如何监控的信息别忘了在本站进行查找喔 。
推荐阅读
- 4口的路由器怎么设置,4口无线路由器
- html标签重叠,html重叠效果
- 小霸王直播游戏录屏软件,怎么直播小霸王游戏
- mysql怎么显示字段值 mysql 显示
- 安卓版破解游戏下载网站,破解版 安卓游戏
- 庭审直播设备公司,庭审直播的相关规定
- mysql分离怎么用 现如今销售什么赚钱
- js代码四舍五入是什么,jsp四舍五入
- 计算机的毕业设计会查重,计算机专业毕设查重是查代码吗