1

在我们的 Documentum 应用程序中检索对象时,需要很长时间。我们在数据源 och 中激活了长时间运行的查询选项,但发现以下查询花费了太多时间:

select all 
  b.r_object_id, dm_repeating1_0.state_name, a.object_name 
from 
  dm_policy_sp  a, 
  dm_sysobject_sp  b, 
  dm_policy_rp dm_repeating1_0 
where 
    (
      (a.r_object_id=b.r_policy_id) 
      and (dm_repeating1_0.i_state_no=b.r_current_state) 
      and b.r_object_id in (N'a long, long list of IDs') 
      or a.r_object_id in (N'a long, long list of IDs')
    ) 
    and /* ...  */

如您所见,表“a”是一个策略表,它只有 7 条记录。在两个“或”运算符之后的 SQL 语句中,我们正在查找object_id表“a”中的 100 个对象!我们执行查询并搜索表“b”(systemObjects)中的那些对象,我们发现这些对象属于表 b!

上述查询大约需要 17 分钟。当我们将表中“or”运算符后面的表名改为b时,只用了10秒!

我们假设这个查询是错误的。我们不知道这是否是 Documentum 中的错误,或者我们配置了 Documentum 错误。我们不知道在哪里可以找到创建此 SQL 或相关组件的 DQL?任何想法?

4

2 回答 2

1

看起来 documentum 在 LifecycleNameDataHandler 和 LifecycleDataHandlerHelper 中执行此操作。我反编译了这些类并找到了这个 DQL 查询

SELECT b.r_object_id, a.state_name, a.object_name FROM dm_policy(all) a, dm_sysobject(all) b WHERE b.r_object_id IN (...) AND a.r_object_id = b.r_policy_id AND a.i_state_no = b.r_current_state启用(基于行)

当用户打开任何具有 LifeCycle 状态名称列的数据网格时,Documentum Webtop 会执行此 DQL 查询。

有几个选项:

  1. 优化数据库级别的查询并从 DQL 进行测试(DA 中的 dql 测试器等)
  2. 反编译类 LifecycleDataHandlerHelper 并以其他方式重写 DQL 查询。尝试添加 FORCE_ORDER 之类的提示或其他内容。
  3. 如果您根本不使用 Life Cycles,您可以轻松禁用此类。在文件 webcomponent\app.xml 行 com.documentum.webcomponent.library.applylifecycle.LifecycleNameDataHandler 应该被注释或禁用。
  4. 从网格中删除生命周期状态名称(或状态名称)。也许用户在他们的自定义网格中选择了这个列。可以建议用户从网格中删除这些列。
于 2013-10-31T11:51:21.287 回答
0

我不知道您到底想通过此查询检索什么,但我认为您的查询可能会按如下方式进行修改:

select all 
  b.r_object_id, dm_repeating1_0.state_name, a.object_name 
from 
  dm_policy_sp  a, 
  dm_sysobject_sp  b, 
  dm_policy_rp dm_repeating1_0 
where 
    (
      (a.r_object_id=b.r_policy_id) 
       AND dm_repeating1_0.r_object_id=a.r_object_id
      and (dm_repeating1_0.i_state_no=b.r_current_state) 
      and (b.r_object_id in (...) 
      or a.r_object_id in (...))
    ) 
于 2013-11-06T09:39:58.353 回答