Я пытаюсь решить проблему неудержимых запросов с помощью 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