Я надеюсь, что некоторые из более опытных разработчиков баз данных/dwh или администраторов баз данных смогут оценить это:
Моя команда использует OBIEE в качестве внешнего инструмента для создания специальных отчетов, которые делают наши бизнес-подразделения.
Существует много задержек при генерации наборов, которые являются относительно небольшими. Нам предстоит ~ 1 час, чтобы создать ~ 50 тыс. записей.
Я изучил один из запросов, который ведет себя таким образом, и с удивлением обнаружил, что все таблицы, на которые ссылаются, подвергаются перекрестному соединению, а затем в предложении WHERE
применяются фильтры.
Итак, чтобы проиллюстрировать, запросы обычно выглядят так:
SELECT ...
FROM tbl1
,tbl2
,tbl3
,tbl4
WHERE tbl1.col1 = tbl2.col1
and tbl3.col2 = tbl2.col2
and tbl4.col3 = tbl3.col3
вместо такого:
SELECT ...
FROM tbl1
INNER JOIN tbl2
ON tbl1.col1 = tbl2.col1
INNER JOIN tbl3
ON tbl3.col2 = tbl2.col2
INNER JOIN tbl4
ON tbl4.col3 = tbl3.col3
Теперь, исходя из того, что я знаю о порядке операций запроса, предложение FROM
выполняется перед предложением WHERE
, поэтому первый пример будет выполняться намного медленнее, чем последний пример. Я прав (пожалуйста, ответьте, только если вы знаете ответ в контексте Oracle DB)? К сожалению, у меня нет прав администратора для запуска трассировки двух разных версий запроса.
Есть ли причина настраивать запрос первым способом, связанным с тем, как работает интерфейс OBIEE? Помните, что запрос является результатом перетаскивания пользователем атрибутов в песочницу из «банка» атрибутов. Предполагается, что выбор любой комбинации атрибутов будет генерировать выходные данные (если данные существуют). Атрибуты берутся из множества разных таблиц. У меня нет опыта разработки механизма, генерирующего SQL на основе такого произвольного выбора атрибутов, поэтому я не знаю, требуется ли структура запроса в первом примере для обслуживания такого рода средства создания отчетов.