postgresql - 直接查询 Postgres INHERITED 表
问题描述
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 子句中更改时,这是不同的。
解决方案
继承的表查找基于实际的 WHERE 子句,该子句映射到 CHECK 表约束。仅仅继承表是不够的。
https://www.postgresql.org/docs/9.6/static/ddl-partitioning.html
警告,您不能在原始查询中未实现实际值的情况下使用动态创建的变量。这将检查所有继承的表。
推荐阅读
- dart - 颤振关闭条件内的对话框
- angular - 如何为原理图创建任务?
- javascript - getUserMedia() - 在移动设备上选择后置摄像头
- android - onBindViewHolder 乱七八糟图片
- ios - UITextView 光标拖动(长按放大镜)不起作用
- postgresql - jdbc PostgreSQL 中的偏移时间(带时区的时间)
- c++ - CTabCtrl,启用和禁用选项卡
- javascript - 收到nodejs事件时执行一个函数
- cygwin - cygwin 环境中的 libmtp:LIBMTP_PANIC 错误
- javascript - javascript匿名函数的生命周期是多少?