[英]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):
最简单的解决方案可能是构建所有表的视图,然后您可以轻松地查询它们。 您可以轻松编写一个过程来生成视图。 此外,如果你使用“union all”,它会更快,如果你想要的结果是所有行(而不是不同的行),你仍然可以通过选择视图中的不同来获取不同的行,如果你有时需要它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.