Многофакторный запрос стежков Cognos выполняется вечно из-за сложных условий IS NULL ИЛИ
Я пытаюсь решить проблему неустранимых запросов с помощью Cognos Analytics 11.0.9 в сравнении со звездной схемой Oracle 12c. Неудержимый запрос поступил из сводной панели, которая отправляла отчеты по пакету Framework Manager и включала многофакторные вычисления. Как и ожидалось, Cognos генерирует SQL, который использует общие табличные выражения для запроса таблиц невидимых фактов, а затем использует "запрос стежка" для объединения этих результатов на основе общих согласованных измерений.
Конкретный беглый запрос имел 4 таблицы фактов и 3 общих измерения. Наш администратор базы данных Oracle говорит, что условия OR в предложении WHERE заставляют Oracle пытаться объединить таблицы фактов до того, как будут вычислены общие выражения таблиц, что очень дорого.
Условия OR, похоже, предназначены для обработки значений NULL в общем измерении. В моей модели данных отсутствуют значения NULL. Есть ли способ заставить Cognos генерировать многофакторный SQL, который предполагает отсутствие значений NULL?
Подробнее... Я немного отредактировал это для удобства чтения, но эти запросы выглядят примерно так:
WITH "FS1" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact1.cost) as cost
FROM fact1
INNER JOIN dim on fact1.dim_key = dim.dim_key
GROUP BY fiscal_year
)
WITH "FS2" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact2.cost) as cost
FROM fact2
INNER JOIN dim on fact2.dim_key = dim.dim_key
GROUP BY fiscal_year
)
WITH "FS3" AS (
SELECT dim.fiscal_year as fiscal_year, SUM(fact3.cost) as cost
FROM fact3
INNER JOIN dim on fact3.dim_key = dim.dim_key
GROUP BY fiscal_year
)
SELECT COALESCE("FS1".fiscal_year, "FS2".fiscal_year, "FS3".fiscal_year) AS fiscal_year,
("FS1".cost + "FS2".cost) +"FS3".cost AS cost
FROM "FS1" FULL OUTER JOIN "FS2" ON
("FS1".fiscal_year = "FS2".fiscal_year OR ("FS1".cost IS NULL AND"FS2".cost IS NULL))
FULL OUTER JOIN "FS3" ON
COALESCE( "FS2".cost, "FS1".cost) = "FS3".cost OR (COALESCE("FS2".cost, "FS1".cost) IS NULL AND "FS3".cost IS NULL)
FETCH FIRST 3001 ROWS ONLY
1 ответ
В Framework Manager есть параметр регулятора для управления SQL-запросом на присоединение стежков при использовании режима динамических запросов. Настройка (DQM) Multi Fact Join Operator
и значение по умолчанию Is Not Distinct From
генерирует SQL, который предполагает наличие значений NULL. По умолчанию генерируется SQL, как указано выше, когда имеется более двух таблиц фактов.
Вы можете изменить губернатора на Equal operator
использовать только "=" в соединениях. Также есть Automatic
настройка, которая будет переключаться между двумя режимами, в зависимости от того, говорит ли модель, что общий размер допускает NULL или нет.
Кажется, это решает проблему, если вы знаете, что в общем измерении нет пустых значений. Кто-нибудь видел лучшее решение этой проблемы?