假设我有一个每天创建的表:
20181227
20181226
20181225
...
有这样的观点:
CREATE OR REPLACE VIEW someview
AS
SELECT * FROM 20181227
UNION
SELECT * FROM 20181226
UNION
SELECT * FROM 20181225
...
有没有一种方法可以用另一个代码替换它,该代码可以自动从所有这些表中获取数据而不必为每个表创建一个联合?现在有一个每天运行的 bash 脚本,每天用一个新的联合重新生成视图,但这并不优雅。
查看表分区。理想情况下,使用最新版本的 Postgres(当前为 Postgres 11),因为 Postgres 10 和 11 有了重大改进。
Postgres 11 允许RANGE、LIST和HASH分区。每天一个大分区会建议基于列的LIST
date
分区,例如:(或者,您可能有一个
timestamp
ortimestamptz
列并为此使用RANGE分区。)然后你可以直接查询主表自动包含所有分区:
或者(因为您主要关心的似乎是简短的语法):
看:
可以进行各种优化,包括约束、索引、列默认值等,具体取决于需求细节。
请务必阅读手册的链接章节以了解各种优缺点。您的应该是完美的用例(除非有未公开的要求)。特别是,您可以轻松快速地添加和删除分区,而对表的其余部分的干扰最小。
目前的实施仍然存在局限性。尤其是分区剪枝对性能的提升有很大帮助,但还有改进的空间(目前正在开发中)。也就是说,对于不需要涉及所有表(分区)的查询,它可能会影响视图的性能,因为视图每次都会考虑所有联合表。对于某些查询,一种可能更快的替代方法是(当前)在自定义
UNION ALL
查询中选择相关表(分区)。并且不要像您的示例中那样使用仅由数字组成的名称
。使用以字母开头的合法小写名称,或者您必须始终将标识符用双引号引起来。20181225
有关的:
从我的角度来看,您应该将数据添加到现有表中,并为“Date_Added”添加一个新字段,并将所有查询都基于该表。否则,几年后您的结构将变得不可读。