2013-10-09 2 views
0

Я часто использую этот запрос, и я бы хотел его оптимизировать.Оптимизация запросов и конкатенация

select 
    number || ' ' || name 
from tasks 
where upper(number || ' ' || name) like '%VALUE%' 

Я создал индекс, но он принял такое же время, как и без индекса

create index name on tasks (upper(number || ' ' || name)) 

Есть ли другие варианты?

+0

Проверили ли вы план запроса? Является ли индекс даже использованным? – mustaccio

+0

Индекс не используется – user49126

+3

Индекс не будет использоваться, потому что у вас есть процент до VALUE, вы заставляете полностью сканировать, и вы не можете с этим справиться. Почему вы все равно объединяете вещи? Какие значения будут иметь значение VALUE, и вы получите его конкатенирование? Почему вы ищете VALUE в любом месте строки? – Ben

ответ

2

Если вы уверены, что условие достаточно селективным, чтобы оправдать использование индекса, то вы можете попробовать содействие в index fast full scan со следующим:

select /*+ INDEX_FFS(tasks your_index_name) */ 
     number || ' ' || name 
from tasks 
where upper(number || ' ' || name) like '%VALUE%' 

Edit:

Кажется, я припоминаю что другим способом содействия IFFS является:

select number || ' ' || name 
from tasks 
where rowid in (
     select rowid 
     from tasks 
     where upper(number || ' ' || name) like '%VALUE%') 

Удивительно малоэффективна, чем прежний метод.

Смежные вопросы