postgresql 查询多个相同的表

Posted

技术标签:

【中文标题】postgresql 查询多个相同的表【英文标题】:postgresql querying on multiple identical tables 【发布时间】:2009-12-02 10:23:19 【问题描述】:

您好,我有几个数据库,例如 mytable_2009_11_19_03,其中最后 2 个数字标识小时(03:00 的表),现在我想查询从 _00 到 _23 的内容。 可以这样做,但是实在是太笨拙了

select * from mytable_2009_11_19_00 where type = 15
UNION
select * from mytable_2009_11_19_01 where type = 15
UNION
...........
select * from mytable_2009_11_19_23 where type = 15

我怎样才能更轻松? 问候

【问题讨论】:

为什么这些在不同的表中? 这不是我的工作 :) 我只是在查询它们,可悲的是我公司使用的软件生成了设计如此糟糕的表格 :> 【参考方案1】:

这个表结构听起来像是要成为data partitioning scheme 的一部分。这不是糟糕的设计。这是一件非常好的事情!

像这样的基于时间的数据总是被添加到前面,并在过期时从后面删除。使用一张巨大的表会导致数据更新时产生大量索引碎片,并导致 VACUUM 等操作的维护时间非常长。

如果您按照我在第一段中包含的链接阅读有关分区的所有内容,您将能够使用 CHECK 约束来非常快速地进行日期搜索。任何包含 WHERE 时间戳 > x AND 时间戳

现在,如果这些表不包含任何时间戳,那么带有 CHECK 约束的分区将不起作用,您只需编写脚本来为您编写笨拙的 UNION 查询。

【讨论】:

非常感谢您的澄清,我总是喜欢听到这样的话:=)【参考方案2】:

如果您知道所有生成的表在模式中总是相同的,那么在 PostgreSQL 中您可以创建一个父表并将新创建的表设置为从父表继承。

CREATE TABLE mytable_2009_11_19 (LIKE mytable_2009_11_19_00);
ALTER TABLE mytable_2009_11_19_00 INHERIT mytable_2009_11_19;
ALTER TABLE mytable_2009_11_19_01 INHERIT mytable_2009_11_19;
.
.
.
ALTER TABLE mytable_2009_11_19_23 INHERIT mytable_2009_11_19;

SELECT * FROM mytable_2009_11_19 where type = 15;

这与使用视图相似,但有区别(首先列出 CON):

(CON) 此方法要求您能够更改各个表,而您可能无权执行此操作。 VIEW 不需要此级别的访问权限。 (CON) 此方法要求所有表都具有相同的结构,或者至少,父级必须仅具有所有子级之间的公共元素。 (PRO) 要将表添加到 VIEW,您必须删除并重新定义 VIEW(以及它的权限,如有必要)。使用父表,可以通过使用 INHERIT/NOINHERIT 更改每个表来轻松添加或删除表。 (PRO) 如果您的架构包含日期和时间戳等字段并且结构很少更改,则可以构建单个父表并滚动使用 INHERIT/NOINHERIT 来提供一个时间“窗口”,您可以在没有查询的情况下对其进行查询必须查询整个历史记录。

【讨论】:

【参考方案3】:

最简单的解决方案可能是构建所有表的视图,然后您可以轻松地查询它们。您可以轻松编写一个过程来生成视图。此外,如果您使用“union all”,它会更快,如果您想要的结果是所有行(而不是不同的行),并且如果您有时需要,您仍然可以通过从视图中选择 distinct 来获取不同的行.

【讨论】:

以上是关于postgresql 查询多个相同的表的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 中具有多个连接的 UPDATE 语句

Rails Postgresql 多个模式和相同的表名

为啥 PostgreSQL 不喜欢大写的表名?

在 postgres 中删除所有共享相同前缀的表

国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询

使用 Cayenne 从具有多个模式的 Postgres 数据库生成类