1

我有来自正在进行采集的客户端的传感器数据。每周我们都会得到一个新数据表(每个表大约一百万行),每个表都有相同的前缀。我想运行一个查询并在所有这些表中选择一些列。

最好的方法是什么?

我已经看到一些使用动态 sql 的解决方案,我正在考虑编写一个存储过程来形成动态 sql 语句并为我执行它。但我不确定这是最好的方法。

4

3 回答 3

1

我看到你正在使用 Postgresql。这是使用基于日期的约束排除进行分区的理想情况。您创建一个没有数据的主表,并且每天添加的其他表继承自它。在您的情况下,您甚至不必担心 INSERT 上的触发器的滋扰;听起来除了每天批量创建新表之外,从来没有任何插入。有关完整文档,请参阅上面的链接。

查询可以针对表运行,Postgres 负责查看所有子表,而且WHERE它足够聪明,可以跳过被标准排除的子表。

于 2013-06-12T03:05:27.527 回答
0

您是对的,有时您必须编写动态 SQL 来处理此类情况。

如果您的所有表都已加载,您可以在存储过程中查询表名。像这样的东西:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' 

使用它来获取您需要的特定表名。

表名如何区分?按日期?一些递增的ID?

于 2013-06-11T16:33:20.627 回答
0

您可以查询具有相同前缀的表的元数据。

select table_name from information_schema.tables where table_name like 'week%'

然后你可以union all用来组合查询,如

select * from week001
union all
select * from week002
[...]

但是我建议将新记录附加到一个表中,并在时间戳列上使用索引。这将特别加快跨越数周等的查询。如果您只需要处理一张表,它将大大简化您的查询。如果表变得太大,您可以按日期等进行分区。因此不需要通过拥有多个表来手动分区。

于 2013-06-11T16:53:42.953 回答