我试图在几个表上建立一个复杂的sql连接:如下所示。我还包括了一个db模式的图像。
考虑表1-
e_id name
1 a
2 b
3 c
4 d
和表2-
e_id date
1 1/1/2019
1 1/1/2020
2 2/1/2019
4 2/1/2019
这里的问题是性能。从表2到表4中,我们只需要给定e\u id的最新条目,但是由于这些表包含历史数据(~>350万行),所以速度非常慢。我附上了一个例子,说明我们目前是如何实现这一点的,但它只包括一个“table_1”与“table_x”的连接。我们按e\u id分组,得到它的最大日期。我们考虑的另一种方法是创建一个物化视图,从中提取数据,并在一段时间后刷新它。欢迎任何改进。
from fds.region as rg
inner join (
select e_id, name, p_id
from fds.table_1
where sec_type = 'S' AND active_flag = 1
) as table_1 on table_1.e_id = rg.e_id
inner join fds.table_2 table_2 on table_2.e_id = rg.e_id
inner join fds.sec sec on sec.p_id = table_1.p_id
inner join fds.entity ent on ent.int_entity_id = sec.int_entity_id
inner join (
SELECT int_1.e_id, int_1.date, int_1.int_price
FROM fds.table_4 int_1
INNER JOIN (
SELECT e_id, MAX(date) date
FROM fds.table_2
GROUP BY e_id
) int_2 ON int_1.e_id = int_2.fsym_id AND int_1.date = int_2.date
) as table_4 on table_4.e_id = rg.e_id
where rg.region_str like '%US' and ent.sec_type = 'P'
order by table_2.int_price
limit 500;
1条答案
按热度按时间r3i60tvu1#
您可以简化此逻辑:
收件人:
这可以利用上的索引
fds.table_4(e_id, date desc)
--用这样的指数可能会很快。您还需要为连接和筛选提供适当的索引。然而,没有执行计划就很难更具体。