Многофакторный запрос стежков Cognos выполняется вечно из-за сложных условий IS NULL ИЛИ - PullRequest
0 голосов
/ 29 июня 2018

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

0 голосов
/ 29 июня 2018

В Framework Manager есть параметр регулятора для управления SQL-запросом на присоединение стежков при использовании режима динамических запросов. Значение (DQM) Multi Fact Join Operator, а значение по умолчанию Is Not Distinct From создает SQL, который предполагает наличие значений NULL. По умолчанию генерируется SQL, как указано выше, когда имеется более двух таблиц фактов.

Вы можете изменить регулятор на Equal operator, чтобы использовать только '=' в соединениях. Существует также параметр Automatic, который будет переключаться между двумя режимами в зависимости от того, говорит ли модель, что общий размер допускает значения NULL или нет.

Кажется, это решает проблему, если вы знаете, что в общем измерении нет NULL. Кто-нибудь видел лучшее решение этой проблемы?

...