Длительный запрос в приложении 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.
Есть несколько вариантов:
- Оптимизируйте запрос на уровне базы данных и тестируйте его из DQL (dql Tester в DA и т. Д.)
- Декомпилируйте класс LifecycleDataHandlerHelper и перезапишите DQL-запрос другим способом. Попробуйте добавить подсказки вроде FORCE_ORDER или что-то еще.
- Если вы вообще не используете жизненные циклы, вы можете легко отключить этот класс. в файле webcomponent\app.xml должна быть прокомментирована или отключена строка com.documentum.webcomponent.library.applylifecycle.LifecycleNameDataHandler.
- Удалите название состояния жизненного цикла (или имя состояния) из сеток. Возможно, пользователи выбирают этот столбец в своих пользовательских сетках. Можно посоветовать пользователям удалить эти столбцы из сетки.
Я не знаю, что именно вы хотите получить по этому запросу, но я думаю, что ваш запрос может быть переработан следующим образом:
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 (...))
)