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