Documentum Пользовательские запросы

Я новичок в изучении Documentum, и мы столкнулись с этим запросом, выполняемым системой, которую мы рассматриваем, как потенциально ускорить:

    SELECT ALL dm_document.r_object_id
    FROM dm_document_sp dm_document
    WHERE (
      dm_document.object_name = :"SYS_B_0"
      AND dm_document.r_object_id IN (
        SELECT r_object_id
        FROM dm_sysobject_r
        WHERE i_folder_id = :"SYS_B_1"
      )
    )
    AND (
      dm_document.i_has_folder = :"SYS_B_2"
      AND dm_document.i_is_deleted = :"SYS_B_3"
    )

Мы рассмотрели возможность добавления индекса или использования профиля SQL. Тем не менее, индекс будет несколько большим и будет продолжать расти. Профиль SQL также необходимо будет периодически пересматривать.

Мы подумали, что будет лучше переписать сам SQL. Есть ли способ переопределить систему для использования пользовательского SQL (т. е. SQL, написанного разработчиками) для определенных запросов, которые автоматически генерирует Documentum?


person Community    schedule 07.08.2019    source источник
comment
почему вы считаете, что SQL, сгенерированный Documentum, плохой? Какой у вас DQL?   -  person Miki    schedule 07.08.2019
comment
Я добавил запрос в исходный пост. Я не говорю, что DQL/SQL обязательно плох, но мы ищем разные способы его оптимизации.   -  person    schedule 07.08.2019
comment
Добавление индексов непосредственно в столбцы БД было тем, как мы это делали. Хотя Documentum имеет возможность добавить его через Documentum, результат тот же. Кстати, кажется, что запрос настолько прост, насколько это возможно.   -  person Miki    schedule 07.08.2019
comment
Хорошо спасибо. Я думаю, вы правы, запрос довольно прост.   -  person    schedule 07.08.2019


Ответы (1)


К сожалению, нет способа изменить поведение Documentum по умолчанию при переводе DQL в результирующий SQL.

Но вы можете напрямую выполнять SQL в своих пользовательских приложениях, заданиях, BOF, компонентах и ​​т. д., используя JDBC. Для запросов, отличных от SELECT, можно также использовать оператор DQL EXECUTE следующим образом:

EXECUTE exec_sql WITH query = 'sql_query'

Другой вариант — зарегистрировать определенные таблицы *_s или *_r и обращаться к ним непосредственно в DQL. Например, вы можете зарегистрировать dm_sysobject_s следующим образом:

REGISTER TABLE dm_dbo.dm_sysobject_s ("r_object_id" CHAR(16))

И тогда вы можете использовать его в DQL:

SELECT object_name FROM dm_sysobject_s

И вы также можете нормально присоединиться к зарегистрированной таблице с типами Documentum в DQL, например:

SELECT object_name FROM dm_sysobject_s s, dmi_queue_item q WHERE s.r_object_id = q.item_id

Но имейте в виду, что Documentum не рекомендует этот подход для прямого доступа к своим внутренним таблицам, но когда вам действительно нужно ускорить ваше приложение, вы должны использовать альтернативные способы.

В любом случае, я бы рекомендовал сначала использовать индексы, и если этого недостаточно, вы можете продолжить шаги, описанные выше.

person cgrim    schedule 07.08.2019
comment
Хорошо, спасибо за предложения. Я согласен, лучше не слишком много возиться с внутренней работой Documentum, если это возможно. - person ; 07.08.2019