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子句中更改时,这是不同的。
继承的表查找基于实际的WHERE子句,该子句映射到CHECK表约束。简单地继承表是不够的。
https://www.postgresql.org/docs/9.6/static/ddl-partitioning.html
注意,您不能使用动态创建的变量,其中实际值未在原始查询中实现。这导致检查所有继承的表。