【问题标题】:Querying Postgres INHERITED tables directly直接查询 Postgres INHERITED 表
【发布时间】:2018-05-22 02:07:58
【问题描述】:

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), ','))

我无法从cte 中的 sup.members 中检索公司,因为我需要来自 u.id 的公司,这在 where 子句中的合作伙伴更改时会有所不同。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    继承的表查找基于实际的 WHERE 子句,该子句映射到 CHECK 表约束。仅仅继承表是不够的。

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

    警告,您不能在原始查询中未实现实际值的情况下使用动态创建的变量。这将检查所有继承的表。

    【讨论】:

    • 这就是设计的实现方式。查看我编辑的帖子。
    猜你喜欢
    • 2021-03-25
    • 2015-09-23
    • 2019-07-01
    • 2016-04-21
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多