postgresql查询多个相同的表

时间:2009-12-02 10:23:20

标签: sql postgresql

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

如果您知道生成的所有表在模式中始终相同,则在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对每个表进行更改,可以轻松添加或删除表。
  • (PRO)如果您的架构包含日期和时间戳等字段且结构很少更改,您可以构建单个父表并在滚动的基础上使用INHERIT / NOINHERIT来提供可以查询的时间“窗口”必须查询整个历史记录。

答案 2 :(得分:1)

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