Прямой запрос к столбцам Postgres - PullRequest
0 голосов
/ 18 мая 2018

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.

1 Ответ

0 голосов
/ 18 мая 2018

Унаследованные таблицы поиска основаны на фактическом предложении WHERE, которое соответствует ограничению таблицы CHECK.Простое наследование таблиц недостаточно.

https://www.postgresql.org/docs/9.6/static/ddl-partitioning.html

Предостережение: нельзя использовать динамически создаваемые переменные, где фактическое значение не реализовано в необработанном запросе.Это приводит к проверке всех унаследованных таблиц.

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