Postgres позволяет создавать таблицы с использованием наследования.У нас есть дизайн, в котором у нас есть 1400 таблиц, которые наследуются от одной основной таблицы.Эти таблицы предназначены для каждого инвентаря нашего поставщика.
Когда я хочу запросить запас для поставщика, я просто запрашиваю основную таблицу.При выполнении Explain
в объяснении говорится, что он проходит через все 1400 индексов и довольно много унаследованных таблиц.Это заставляет запрос выполняться очень медленно.Если я запрашиваю только таблицу запасов поставщика, я сокращаю время запроса менее чем на 50%, выполняя запросы к основной таблице.
У нас есть соединение с другой таблицей, которая извлекает идентификаторы для поставщиков партнеров поставщика имы также хотим запросить их акции.Пример:
SELECT
(select m2.company from sup.members m2 where m2.id = u.id) as company,
u.id,
u.item,
DATE_PART('day', CURRENT_TIMESTAMP - u.datein::timestamp) AS daysinstock,
u.grade as condition,
u.stockno AS stocknumber,
u.ic,
CASE WHEN u.rprice > 0 THEN
u.rprice
ELSE
NULL
END AS price,
u.qty
FROM pub.net u
LEFT JOIN sup.members m1
ON m1.id = u.id OR u.id = any(regexp_split_to_array(m1.partnerslist,','))
WHERE u.ic in ('01036') -- part to query
AND m1.id = 'N40' -- vendor to query
В таблице n40_stock есть запас для поставщика с id = N40, а партнерами-партнерами N40 (список партнеров) являются G01, G06, G21, K17, N49, V02, M16, поэтому я также хотел бызапросить таблицы g01_stock, g06_stock, g21_stock, k17_stock, n49_stock, v02_stock и m16_stock.
Я знаю об предложении ONLY, но есть ли возможность изменить этот запрос, чтобы получить данные ТОЛЬКО от конкретных унаследованных таблиц?
Редактировать
Это сокращает время до 800 мс, но мне бы хотелось, чтобы оно было меньше:
WITH cte as (
SELECT partnerslist as a FROM sup.members WHERE id = 'N40'
)
SELECT
(select m2.company from sup.members m2 where m2.id = u.id) as company,
u.id,
u.item,
DATE_PART('day', CURRENT_TIMESTAMP - u.datein::timestamp) AS daysinstock,
u.grade as condition,
u.stockno AS stocknumber,
u.ic,
CASE WHEN u.rprice > 0 THEN
u.rprice
ELSE
NULL
END AS price,
u.qty
FROM pub.net u
WHERE u.ic in ('01036') -- part to query
AND u.id = any(regexp_split_to_array('N40,'||(select a from cte), ','))
Я не могу получить компанию от sup.membersв cte
, потому что мне нужен один из u.id, который отличается при изменении партнера в предложении where.