2009-12-02 199 views
2

您好我有几个数据库,如mytable_2009_11_19_03哪里最后2个数字标识小时(03:00表),现在我想查询从_00到_23的东西。 它可以以这样的方式来完成,但它确实是笨拙postgresql查询多个相同的表

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 

我怎么能做到这一点更容易? 关于

+0

为什么地球上那些在不同的桌子上? – 2009-12-02 10:29:28

+0

不好我的工作:)我只是查询他们,可悲的是我的公司使用的软件生成如此糟糕的设计表:> – Hellnar 2009-12-02 10:31:50

回答

1

最简单的解决方案可能是建立一个所有表的视图,然后你可以很容易地查询它们。您可以轻松编写一个过程来生成视图。另外,如果你使用“union all”,如果你想要的结果是所有的行(与不同的行相对),并且你仍然可以通过在视图中选择不同的视图来抓取不同的行。

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)此方法需要您能够改变各个表,你可能没有权利去做。 VIEW不需要这种访问级别。
  • (CON)该方法要求表格都具有相同的结构,或者至少,父项必须只有所有子项之间的公共元素。
  • (PRO)要向VIEW添加表格,您必须删除并重新定义VIEW(如果需要,还需要它的权限)。对于父表,通过使用INHERIT/NOINHERIT来更改每个表,可以很容易地添加或删除表。 (PRO)如果您的模式包含日期和时间戳等字段,并且结构很少发生更改,您可以构建单个父表,并在滚动基础上使用INHERIT/NOINHERIT来提供一个可以查询的时间“窗口”不得不查询整个历史。
4

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

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

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

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

+0

非常感谢澄清,我总是喜欢听到这样的东西:=) – Hellnar 2009-12-22 21:38:35