Как вставить фильтры в группу представления по предложению? - PullRequest
0 голосов
/ 26 марта 2020

У нас есть сторонний инструмент BI в проекте, который может добавить только предложение where с указанными фильтрами для выбора таблицы / представления. Мы используем набор из 4 исходных таблиц, у них есть индексы для столбцов, которые можно фильтровать с помощью пользовательского интерфейса BI. У нас есть представление для каждой таблицы, которая группирует по индексированным столбцам и добавляет 1 дополнительный столбец. Затем у нас есть другое представление, объединяющее все данные из этих четырех представлений с использованием столбцов индекса, то есть представление, запрашиваемое из пользовательского интерфейса нашего BI, BI добавляет к запросам условие where.

Проблема заключается в индексировании на исходные таблицы не используются, фильтры не помещаются на уровень таблиц, а применяются в самом конце. Мы не можем использовать функцию Set Returning, все, что может сделать наш инструмент BI, это просто выбрать из таблицы \ представления и добавить предложение where.

Мы думали о перехвате условия select, где в Pg, но я не уверен, возможно ли это. Или, может быть, можно намекнуть оптимизатору, что фильтры должны быть нажаты. Мы можем запрашивать исходные таблицы напрямую, не используя представления, но это умножит количество источников данных \ элементов в пользовательском интерфейсе, что нежелательно. Есть ли другие способы, которыми мы можем решить эту проблему в PostgreSQL?

Обновление 1

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

CREATE TABLE source_table_1
(
  dim1                        VARCHAR(255) NOT NULL,
  dim2                        VARCHAR(255) NOT NULL,
  dim3                        VARCHAR(255) NOT NULL,
  meausre1                    Bigint       NOT NULL,
  meausre2                    Bigint       NOT NULL,
  meausre3                    Bigint       NOT NULL
);
CREATE INDEX ON uc13_failures_by_cell (dim1, dim2, dim3);

... another 3 tables

CREATE OR REPLACE VIEW view1 AS
SELECT 
      "type1" as type,
      dim1,
      dim2,
      dim3,
      sum(meausre1) AS meausre1,
      sum(meausre2) AS meausre2,
      sum(meausre3) AS meausre3
FROM source_table_1
GROUP BY 1, 2, 3, 4;

... another 3 views

CREATE OR REPLACE VIEW view_uinion AS
SELECT 
      coalesce(view1.dim1, view2.dim1, view3.dim1, view4.dim1) AS dim1,
      ... two other dims
      view1.meausre1             AS meausre1_1,
      view2.meausre1             AS meausre2_1,
      view3.meausre1             AS meausre3_1,
      view4.meausre1             AS meausre4_1,
      ... two meausres
FROM view1
         FULL JOIN view2 ON
            view1.dim1 = view2.dim1 AND
            view1.dim2 = view2.dim2 AND
            view1.dim3 = view2.dim3 AND
         FULL JOIN view3 ON ...
         FULL JOIN view4 ON ...
WHERE -- this is were filters on dims are inserted
;

1 Ответ

1 голос
/ 26 марта 2020

Вы не можете перевести условие sh a WHERE в полное внешнее объединение.

См. Этот пример:

CREATE TABLE a(id integer NOT NULL, a1 integer NOT NULL);

INSERT INTO a VALUES (1, 20), (2, 20);

CREATE TABLE b(id integer NOT NULL, b1 integer NOT NULL);

INSERT INTO b VALUES (2, 30), (3, 30);

SELECT *
FROM a
   FULL JOIN b USING (id)
WHERE b1 = 30;

 id | a1 | b1 
----+----+----
  2 | 20 | 30
  3 |    | 30
(2 rows)

SELECT *
FROM a
   FULL JOIN (SELECT *
              FROM b
              WHERE b1 = 30) AS b_red
      USING (id);

 id | a1 | b1 
----+----+----
  1 | 20 |   
  2 | 20 | 30
  3 |    | 30
(3 rows)

Таким образом, вам придется изменить базовые запросы / представления .

Если бы вы использовали внутренние объединения, это не было бы проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...