繁体   English   中英

postgresql查询多个相同的表

[英]postgresql querying on multiple identical tables

您好我有几个数据库,例如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

我怎么能这样做更容易? 问候

该表结构听起来像是数据分区方案的一部分 这不错设计。 这是一件非常好的事情!

像这样的基于时间的数据总是被添加到前面并且在它到期时从后面掉落。 使用一个巨大的表会导致数据更新时出现大量索引碎片,并导致VACUUM等操作的维护时间非常长。

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

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

如果您知道生成的所有表在模式中始终相同,则在PostgreSQL中您可以创建父表并将新创建的表从父设置为INHERIT。

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对每个表进行ALTER处理,可以轻松添加或删除表。
  • (PRO)如果您的模式包含日期和时间戳等字段且结构很少更改,您可以构建单个父表并在滚动的基础上使用INHERIT / NOINHERIT来提供可以查询的时间“窗口”,而无需查询整个历史。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM