案例:
物料查询主界面(Master Item Screen)更新速度极慢,有时候需要数分钟才能保存。
诊断:
做Form Trace,诊断日志中可以发现下面一段SQL执行效率很低:
Trace file: /……/udump/test_ora_16779_XZB.trc Sort options: fchela ******************************************************************************** count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually for update) rows = number of rows processed by the fetch or execute call ******************************************************************************** SELECT WTG_ROWID,ROWID FROM DR$WAITING WHERE WTG_CID = :b1 AND WTG_PID = :b2 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 0 0.00 0.00 0 0 0 0 Execute 2 0.00 4.85 0 0 0 0 Fetch 2 68700.00 68223.81 30187 30398 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 68700.00 68228.66 30187 30398 0 0 Misses in library cache during parse: 0 Optimizer goal: CHOOSE Parsing user id: 31 (recursive depth: 2)
DR$WAITING 是Oracle Text相关表之一,和DR$PENDING等一系列表一样,主要用于全文检索相关功能的正常运作。简单来讲,DR$PENDING用于索引同步,当同步完成时里面的记录会自动删除,如果同步过程中相关记录又被修改,则相关信息暂时存放于DR$WAITING。检查该表行数:
SELECT COUNT(1) FROM dr$waiting; SELECT COUNT(1) FROM dr$pending;
如果存在大量记录(比如百万级),通常意味着相关程序没有正常进行(同步)。针对EBS环境,Metalink 382809.1 中介绍了几个常规的用于清理无效记录的请求:
- Rebuild Help Search Index (AFLOBBLD)
- JTF Item InterMedia Index Optimizing operation (JTFOPTI)
- 参数p_optimize_level: FAST|FULL
- 参数p_runtime: 数值,默认为最大
- JTF Item InterMedia Index Sync Operation (JTFSYNC)
- MES InterMedia Index Optimizing operation (AMVOPTI)
- MES InterMedia Index Sync Operation (AMVSYNC)
- Knowledge Management Index Synchronization (CS_KB_SYNC_INDEX)
- Rebuilding Intermedia Index for Task Names (JTFTKIMD)
- Synchronize JTF_NOTES_TL_C1 index (JTF_NOTES_TL_C1_SYNC)
对于全文索引而言,所谓同步即加入新的关键词,而优化则意味着清理过期、失效的关键词。如果以上并发请求执行完毕后在DR$PENDING依旧存在记录,则可以手工进行同步:
SELECT du.username,
idx.idx_name
FROM ctxsys.dr$index idx,
dba_users du
WHERE du.user_id = idx.idx_owner#
AND EXISTS
(SELECT NULL FROM ctxsys.dr$pending pnd WHERE pnd.pnd_cid = idx.idx_id)
如:
SQL> exec ctx_ddl.sync_index('AMV.AMV_C_CHANNELS_DESC_CTX');
正常情况下,全部手工处理一遍后,DR$WAITING中记录数应该为0。从DBA角度,CTX_DDL包中有几个优化索引的Procedure,可以考虑定期执行优化程序(清理被删除的Term)。
在本例中,尽管执行了以上步骤,并不意味着主物料查询界面的效率会有多大提升。由于高水印(High Water)的关系,查询DR$WAITING的速度并不会有多大提升。此时检查DR$WAITING中记录,当记录数为0时,进行TRUNCATE操作,该操作可以去除高水印对查询效率的影响。如果DR$WAITING中记录数不为0,对于DR$PENDING存在的记录,可以删除这些记录后重新同步:
DELETE FROM dr$waiting
WHERE EXISTS (SELECT 1
FROM dr$pending
WHERE dr$pending.pnd_cid = dr$waiting.wtg_cid
AND dr$pending.pnd_pid = dr$waiting.wtg_pid
AND dr$pending.pnd_rowid = dr$waiting.wtg_rowid)
(正常情况下,这些记录会被自动删除)
重新进入主物料界面,对操作做Trace后查看日志:
SELECT WTG_ROWID,ROWID FROM DR$WAITING WHERE WTG_CID = :b1 AND WTG_PID = :b2 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 0 0.00 0.00 0 0 0 0 Execute 2 0.00 4.04 0 0 0 0 Fetch 2 0.00 1.20 0 6 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.00 5.24 0 6 0 0 Misses in library cache during parse: 0 Optimizer goal: CHOOSE Parsing user id: 31 (recursive depth: 2)
Oracle Text极其相关表的信息可以参考《Text Application Developer’s Guide》和《Text Reference》。
