我连接了一些表来生成我需要的结果数据集(如下所示)。
查询:
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 子句的更有效方法是什么?
查询不等价:
在对您来说运行速度很快的查询中,
WHERE
条件在DISTINCT
之前执行,它可能可以有效地过滤行
在慢速查询中,
WHERE
条件应用于DISTINCT
,这会阻止此类过滤,并可能会给您不同的查询结果
我的建议是取消视图定义中的
DISTINCT
。如果您确实需要它,请将其写入使用视图的查询中。