длительный запрос в приложении documentum - PullRequest
1 голос
/ 08 сентября 2011

При получении объектов в нашем приложении 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 между 100 объектами в таблице «а»!Мы выполнили запрос и искали эти объекты в таблице "b" (systemObjects) и обнаружили, что эти объекты принадлежат таблице b!

Приведенный выше запрос занимает около 17 минут.Когда мы изменили имя таблицы после оператора «или» в таблице на b, это заняло всего 10 секунд!

Мы предполагаем, что этот запрос неверен.Мы не знаем, является ли это ошибкой в ​​Documentum или мы неправильно настроили Documentum.Мы не знаем, где мы можем найти DQL, который создает этот SQL или связанные компоненты?Любая идея?

Ответы [ 2 ]

1 голос
/ 31 октября 2013

Похоже, что documentum делает это внутри LifecycleNameDataHandler и LifecycleDataHandlerHelper. Я декомпилировал эти классы и нашел этот DQL-запрос

ВЫБРАТЬ b.r_object_id, a.state_name, a.object_name ОТ dm_policy (все) a, dm_sysobject (все) b WHERE b.r_object_id IN (...) И a.r_object_id = b.r_policy_id И a.i_state_no = b.r_current_state ENABLE (на основе строки)

Documentum Webtop выполняет этот DQL-запрос, когда пользователь открывает любую сетку данных со столбцом имени состояния LifeCycle.

Есть несколько вариантов:

  1. Оптимизация запроса на уровне базы данных и тестирование его из DQL (dql Tester в DA и т. Д.)
  2. Декомпилируйте класс LifecycleDataHandlerHelper и перезапишите DQL-запрос другим способом. Попробуйте добавить такие подсказки, как FORCE_ORDER или что-то еще.
  3. Если вы вообще не используете жизненные циклы, вы можете легко отключить этот класс. в файле webcomponent \ app.xml должна быть закомментирована или отключена строка com.documentum.webcomponent.library.applylifecycle.LifecycleNameDataHandler.
  4. Удалить название состояния жизненного цикла (или имя состояния) из сеток. Возможно, пользователи выбирают этот столбец в своих пользовательских сетках. Можно посоветовать пользователям удалить эти столбцы из сеток.
0 голосов
/ 06 ноября 2013

Я не знаю, что именно вы хотите получить по этому запросу, но я думаю, что ваш запрос может быть переработан следующим образом:

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 (...))
    ) 
...