Postgres SQL медленный при использовании оператора OR - PullRequest
0 голосов
/ 10 мая 2019

У меня есть запрос, который занимает 12 секунд (в журнальной таблице 1,2 м строк), основная причина ниже

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%'))

Однако таблица журнала работает нормально. Doing

select * from myJournal where algorithm like 'cheese%' --takes < 1 sec.

Запрос также выполняется нормально, если я удалю четыре соединения (которые не используются в предложении where).

Когда я объединяю более 3 таблиц, производительность резко / экспоненциально снижается.

1 Ответ

0 голосов
/ 10 мая 2019

Я бы начал писать запрос так:

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.

...