【发布时间】:2021-06-15 16:19:33
【问题描述】:
我有一个包含许多大表的架构,它们都具有相同的结构。每个表的 id 都有一个索引。我还有一个单独的表,其中包含其他表中的所有 id,指向它们的表名;例如,架构中的表:
Table 'A'
id content
1 ...
2 ...
3 ...
Table 'B'
id content
4 ...
5 ...
6 ...
Table 'C'
id content
5 ...
6 ...
7 ...
(如您所见,表中的 id 并不总是唯一的)然后是带有查找的表:
Table 'lookup'
id tablename
1 'A'
2 'A'
3 'A'
4 'B'
5 'B'
5 'C'
6 'B'
6 'C'
7 'C'
现在,我该如何制作这样的视图?
SELECT
id, content
FROM
view
WHERE
id = 6
它将从 B 和 C 中选择内容(其中 id 为 6)。此外,它应该只对 B 和 C 进行索引扫描以减少搜索时间。再一次,有很多桌子,而且很大。到目前为止,大多数 id 在表格中都是唯一的。
我该怎么做? (或者,我应该这样做吗?)
PS 表的内容没有存储到单个表中,因为卷在不断增长,并且在一段时间后插入/复制到该索引表中变得非常缓慢。此外,只需截断单独的表即可更轻松地删除特定数据。
【问题讨论】:
-
如果您使用继承或分区来构建表结构会容易得多。
-
(SELECT * FROM 'A' WHERE id <= 3) UNION ALL (SELECT * FROM 'B' WHERE id >= 4 AND id <= 6) UNION ALL (SELECT * FROM 'C' WHERE id >= 5)可能会起作用。但正如 Bernando 所说,这听起来像是一个完美的分区用例——除了你一次在多个表中有一些行!为什么? -
@Bergi 只是为了提供一些上下文:每个表指的是一个地理区域,而行指的是这些区域内的几何对象。一个对象可能存在于多个区域(在边界上)。它的对象 ID 会出现在多个表中,但几何形状不同。我想创建一个高效的视图来选择所有这些表中任意对象 id 的所有行(数百个,每个表有多个 GB)
-
@BernardoJerez 我不熟悉继承和分区,所以会研究一下。非常感谢。
-
@pklaassen 这两个对象在两个表中的内容是否相同?这听起来像是一个标准化问题。
标签: postgresql psql