У нас есть сторонний инструмент 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
;