Postgres SQL在使用OR语句时速度较慢

Postgres SQL在使用OR语句时速度较慢,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,我有一个需要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 = Calculat

我有一个需要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%'))
选择1
从…起
我的桌子我的桌子
在(Journal.status=0和myTable.id=Journal.myTableId)上加入myJournal日志
加入到达时间(myTable.id=arrival.myTableId)
在(myTable.id=computed.myTableId)上加入计算
在上加入ms(Parent.id=ms.myTableId)
连接性能(myTable.id=perf.myTableId)
join ref on(myTable.id=ref.myTableId)
哪里
((myTable.name,如“cheese%”或

Journal.algorithm,比如'cheese%'或者——如果删除了它,那么它就很好了I首先将查询写为:

select 1
from myTable t join
     myJournal j
     on t.id = j.myTableId
where j.status = 0 and
      (t.name like 'cheese%' or 
       j.algorithm like 'cheese%' or 
       t.client like 'cheese%' or 
       t.something like 'cheese%'
      )
那么这方面的最佳索引可能是
myJournal(status,myTableId,algorithm)
myTable(id,name,client,something)


这些索引主要用于
连接
和第一个筛选条件。它们对字符串比较没有多大帮助。但是,由于
条件,这些索引很难优化。

也许您需要在
日志(myTableId,status)上使用一个复合索引
。据我所知,像“%cheese%”这样的表达式
无法使用索引。如果您有这种需要,请研究使用全文搜索。否则,如果您想使用索引,请确保您使用的是整列或只使用前缀,而不是后缀。@TimBiegeleisen好的,谢谢,但这并不能完全解释速度慢的原因?由于该查询本身是fastWell,因此您添加了更多的限制,这意味着它需要更长的时间查询可能没有使用索引。@TimBiegeleisen是的,我理解。我编辑了我的问题,问题仍然存在,所以我认为我的问题是所有相关的信息,但还有其他连接没有在where中使用。当我删除其他连接,但保留缓慢的int位问题时,性能会显著提高,就像删除这一条或语句。我是否达到了一些博士后的加入门槛?哈哈,我没有投反对票。因此,如果我加入3个以上的表,性能会显著下降。也许我达到了一些博士后的内部限制/threshold@NimChimpsky…首先,您无法真正优化字符串上的
比较;无论是
还是
和字符串都会阻碍这一点(除非Postgres对此有一种奇特的机制)。第二,您可能会优化连接。第三,在查看结果以测量持续时间时,您必须小心。这可能是第一个结果返回速度的函数,而不是所有结果的函数。仅供参考,设置本地启用\u nestloop=off;修复problem@NimChimpsky…很有趣。复杂的
在哪里
子句导致Postgres切换到嵌套循环联接。在我看来,这听起来像是优化器中的一个bug。
select 1
from myTable t join
     myJournal j
     on t.id = j.myTableId
where j.status = 0 and
      (t.name like 'cheese%' or 
       j.algorithm like 'cheese%' or 
       t.client like 'cheese%' or 
       t.something like 'cheese%'
      )