【发布时间】:2019-05-10 01:32:10
【问题描述】:
我有一个需要 12 秒的查询(日志表 1.2m 行),根本原因如下
select 1
from
myTable myTable
join myJournal Journal on (Journal.status=0 and myTable.id = Journal.myTableId)
join arrival Arrival on (myTable.id = Arrival.myTableId)
join calc Calc on (myTable.id = Calculated.myTableId)
join ms ms on (Parent.id = ms.myTableId)
join perf Perf on (myTable.id = Perf.myTableId)
join ref Ref on (myTable.id = Ref.myTableId)
where
((myTable.name like 'cheese%' or
Journal.algorithm like 'cheese%' or --if this is removed, its fine <1sec
myTable.client like 'cheese%' or
myTable.something like 'cheese%'))
但是日志表执行正常。在做
select * from myJournal where algorithm like 'cheese%' --takes < 1 sec.
如果我删除了四个连接(未在 where 子句中使用),查询也可以正常执行。
当我加入超过 3 个表时,性能会急剧/成倍下降。
【问题讨论】:
-
也许您可能需要在
Journal(myTableId,status)上建立一个复合索引。 -
据我所知,表达式
ilike '%cheese%'不能使用索引。如果您有这种需求,请考虑使用全文搜索。否则,如果要使用索引,请确保使用整个列或仅使用前缀,而不是后缀。 -
@TimBiegeleisen 好的,谢谢,但这并不能完全解释缓慢吗?因为该查询本身很快
-
嗯,您正在添加更多限制,这意味着需要更长的时间。在这里要清楚,您的“OK”查询可能没有使用索引。
-
@TimBiegeleisen 是的,我明白这一点。我已经编辑了我的问题,问题仍然存在
标签: sql postgresql query-optimization