Длительный запрос в приложении documentum

При получении объектов в нашем приложении 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 /* ...  */

Как видите, таблица "а" - это таблица политик, и в ней всего 7 записей. В операторе SQL после обоих операторов "или" мы ищем object_id между 100 объектами в таблице "а"! Мы выполнили запрос и искали эти объекты в таблице "b" (systemObjects) и мы обнаружили, что эти объекты принадлежат таблице b!

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

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

2 ответа

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

ВЫБЕРИТЕ b.r_object_id, a.state_name, a.object_name FROM 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_cur ВКЛЮЧИТЬ (row_based)

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. Удалите название состояния жизненного цикла (или имя состояния) из сеток. Возможно, пользователи выбирают этот столбец в своих пользовательских сетках. Можно посоветовать пользователям удалить эти столбцы из сетки.

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

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 (...))
    ) 
Другие вопросы по тегам