您好我有几个数据库,例如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
我怎么能这样做更容易? 问候
答案 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):
答案 2 :(得分:1)
最简单的解决方案可能是构建所有表的视图,然后您可以轻松地查询它们。您可以轻松编写一个过程来生成视图。此外,如果你使用“union all”,它会更快,如果你想要的结果是所有行(而不是不同的行),你仍然可以通过选择视图中的不同来获取不同的行,如果你有时需要它