使用OR语句时Postgres SQL变慢

时间:2019-05-10 01:32:10

标签: 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 = 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个以上的表时,性能会急剧/指数级下降。

1 个答案:

答案 0 :(得分:0)

我首先将查询编写为:

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)

这些索引主要用于join和第一个过滤条件。他们对字符串比较没有多大帮助。但是,由于or的条件,这些很难优化。