我有来自正在进行采集的客户端的传感器数据。每周我们都会得到一个新数据表(每个表大约一百万行),每个表都有相同的前缀。我想运行一个查询并在所有这些表中选择一些列。
最好的方法是什么?
我已经看到一些使用动态 sql 的解决方案,我正在考虑编写一个存储过程来形成动态 sql 语句并为我执行它。但我不确定这是最好的方法。
我有来自正在进行采集的客户端的传感器数据。每周我们都会得到一个新数据表(每个表大约一百万行),每个表都有相同的前缀。我想运行一个查询并在所有这些表中选择一些列。
最好的方法是什么?
我已经看到一些使用动态 sql 的解决方案,我正在考虑编写一个存储过程来形成动态 sql 语句并为我执行它。但我不确定这是最好的方法。
我看到你正在使用 Postgresql。这是使用基于日期的约束排除进行分区的理想情况。您创建一个没有数据的主表,并且每天添加的其他表继承自它。在您的情况下,您甚至不必担心 INSERT 上的触发器的滋扰;听起来除了每天批量创建新表之外,从来没有任何插入。有关完整文档,请参阅上面的链接。
查询可以针对父表运行,Postgres 负责查看所有子表,而且WHERE
它足够聪明,可以跳过被标准排除的子表。
您是对的,有时您必须编写动态 SQL 来处理此类情况。
如果您的所有表都已加载,您可以在存储过程中查询表名。像这样的东西:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
使用它来获取您需要的特定表名。
表名如何区分?按日期?一些递增的ID?
您可以查询具有相同前缀的表的元数据。
select table_name from information_schema.tables where table_name like 'week%'
然后你可以union all
用来组合查询,如
select * from week001
union all
select * from week002
[...]
但是我建议将新记录附加到一个表中,并在时间戳列上使用索引。这将特别加快跨越数周等的查询。如果您只需要处理一张表,它将大大简化您的查询。如果表变得太大,您可以按日期等进行分区。因此不需要通过拥有多个表来手动分区。