在documentum应用程序中长时间运行查询

时间:2011-09-08 15:08:21

标签: dql wdk documentum webtop

在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语句中,我们在表“a”中的100个对象之间寻找object_id!我们执行了一个查询并在表“b”(systemObjects)中搜索了这些对象,我们发现这些对象属于表b!

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

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

2 个答案:

答案 0 :(得分:1)

看起来documentum在LifecycleNameDataHandler和LifecycleDataHandlerHelper中完成。我反编译这些类并找到了这个DQL查询

选择b.r_object_id,a.state_name,a.object_name FROM dm_policy(全部)一个,dm_sysobject(全部)B,其中b.r_object_id IN(...)和a.r_object_id = b.r_policy_id AND a.i_state_no = b.r_current_state ENABLE(row_based)

当用户使用LifeCycle州名列打开任何数据网格时,Documentum Webtop会执行此DQL查询。

有几个选项:

  1. 优化数据库级别的查询并从DQL(DA等中的dql Tester)测试它
  2. 反编译类LifecycleDataHandlerHelper并以其他方式重写DQL查询。尝试添加FORCE_ORDER等提示。
  3. 如果您根本不使用Life Cycles,则可以轻松禁用此类。在webcomponent \ app.xml行文件中,应注释或禁用com.documentum.webcomponent.library.applylifecycle.LifecycleNameDataHandler。
  4. 从网格中删除生命周期状态名称(或状态名称)。也许用户在他们的自定义网格中选择此列。建议用户从网格中删除此列。

答案 1 :(得分: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 (...))
    )