Postgresql 查询与视图执行速度问题

问题描述 投票:0回答:1

我连接了一些表来生成我需要的结果数据集(如下所示)。

查询:

    select distinct on (e."Col1", e."Col2")
        s."ColM",
        s."ColN",
        m."ColX" as "m_ColX",
        m."ColY" as "m_ColY",
        n."ColZ1" as "n.ColZ1",
        n."ColZ2" as "n.ColZ2",
        e."Col1",
        e."Col2"
    from schema1."Table1" s
    left join schema1."Table2" e on s."SrcId" = e.sid and date_trunc('second',s."CreatedTime")=date_trunc('second',e."ReportedTime")
    left join schema1."Table3" m on m."Sid"=s."SrcId" and m."IsActive"=TRUE
    left join schema1."Table4" n on n."Sid"=s."SrcId" and n."IsActive"=TRUE;

当我直接使用 where 子句执行查询时(如下所示),结果几乎是瞬时的。

select distinct on (e."Col1", e."Col2")
        s."ColM",
        s."ColN",
        m."ColX" as "m_ColX",
        m."ColY" as "m_ColY",
        n."ColZ1" as "n.ColZ1",
        n."ColZ2" as "n.ColZ2",
        e."Col1",
        e."Col2"
    from schema1."Table1" s
    left join schema1."Table2" e on s."SrcId" = e.sid and date_trunc('second',s."CreatedTime")=date_trunc('second',e."ReportedTime")
    left join schema1."Table3" m on m."Sid"=s."SrcId" and m."IsActive"=TRUE
    left join schema1."Table4" n on n."Sid"=s."SrcId" and n."IsActive"=TRUE
    where s."SrcId"=10 and s."CreatedTime" between '2024-10-10T00:00:00.000Z' and '2024-10-10T10:10:10.000Z'

但是如果我在视图中使用相同的查询,则结果需要更长的时间。 为简单起见,假设该视图称为 view1,我按如下方式调用它:

select * from schema1.view1 where "SrcId"=10 and "CreatedTime" between '2024-10-10T00:00:00.000Z' and '2024-10-10T10:10:10.000Z'

有人可以指出为什么会出现这种情况,以及我是否可以采取任何措施来改进/优化调用视图,从而产生类似的性能?

首先想到的是视图可能需要时间将 where 子句字段与实际表中的字段关联起来,以确定将它们映射到哪些字段。这可能是罪魁祸首(或者更糟糕的是,这也会扭曲我的结果?)如果是这样,通过 where 子句的更有效方法是什么?

postgresql select view psql
1个回答
0
投票

查询不等价:

  • 在对您来说运行速度很快的查询中,

    WHERE
    条件在
    DISTINCT
    之前执行,它可能可以有效地过滤行

  • 在慢速查询中,

    WHERE
    条件应用于
    DISTINCT
    ,这会阻止此类过滤,并可能会给您不同的查询结果

我的建议是取消视图定义中的

DISTINCT
。如果您确实需要它,请将其写入使用视图的查询中。

© www.soinside.com 2019 - 2024. All rights reserved.