案例:
物料查询主界面(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 中介绍了几个常规的用于清理无效记录的请求:

  1. Rebuild Help Search Index (AFLOBBLD)
  2. JTF Item InterMedia Index Optimizing operation (JTFOPTI)
    • 参数p_optimize_level: FAST|FULL
    • 参数p_runtime: 数值,默认为最大
  3. JTF Item InterMedia Index Sync Operation (JTFSYNC)
  4. MES InterMedia Index Optimizing operation (AMVOPTI)
  5. MES InterMedia Index Sync Operation (AMVSYNC)
  6. Knowledge Management Index Synchronization (CS_KB_SYNC_INDEX)
  7. Rebuilding Intermedia Index for Task Names (JTFTKIMD)
  8. 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》。