优化复杂的postgresql查询

mfpqipee  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(333)

我试图在几个表上建立一个复杂的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;
r3i60tvu

r3i60tvu1#

您可以简化此逻辑:

(
        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

收件人:

(SELECT DISTINCT ON (int_1.e_id) int_1.*
 FROM fds.table_4 int_1
 ORDER BY int_1.e_id, int_1.date DESC
) table_4

这可以利用上的索引 fds.table_4(e_id, date desc) --用这样的指数可能会很快。
您还需要为连接和筛选提供适当的索引。然而,没有执行计划就很难更具体。

相关问题