【发布时间】:2020-03-28 19:34:53
【问题描述】:
基本上我们有一个事实表(实际上它是分区的并且具有相当宽的结构) - 事务表,一旦事务被加载并且永远不会更改它拥有的 ID,并且我们有两个字段是相同的 ID维度(此维度的属性会不时更改)。
我们需要从维度表的一行中查询事实表中所有“名称”不同的记录。
我们如何才能在那里获得最佳性能?
另外:
- 事实表和维度表都是按计划填充的,因此如果我们可以通过添加一些映射表来提高性能 - 可以这样做
- 索引、数组、复合索引 - 随便
- PostgreSQL 10(如果 11 和 12 中的内容可以提供帮助 - 不胜感激)
- 代码如下
任何关于如何重组它以更快地获得相同结果的想法 - 将不胜感激。
事实表
select
generate_series as row_id
,(random()*1000000)::bigint as id1
,(random()*1000000)::bigint as id2
into table_fact
from generate_series(1,10000000);
维度表
select
generate_series as row_id
,'Dimension #' || (random()*10000)::bigint as dim
into table_dim
from generate_series(1,1000000);
查询
select
tf.row_id
,tf.id1
,tf.id2
,td1.dim
,td2.dim
from table_fact tf
left join table_dim td1 on tf.id1=td1.row_id
left join table_dim td2 on tf.id2=td2.row_id
where not (td1.dim = td2.dim);
【问题讨论】:
-
使用你的设置脚本,table_fact 中的几乎每一行都会被返回。 (在我执行它时,只有 12 个被省略)。一般情况会这样吗?
-
这些 table_fact{id1,id2} 字段是否应该引用维度表?在这种情况下,它们应该是外键。此外,为了有意义,table_dim.dim 可能需要是唯一的(并且不是 NULL)
标签: postgresql join query-performance