Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимизация запроса с LIKE '%'  [new]
Roman Schepalov
Member

Откуда: Spb
Сообщений: 67
Оптимизируются ли запросы такого вида:

SELECT dc_id, dc_code, dc_name, dc_atype, '' puid
    FROM invbook.inb_docs
    WHERE dc_code LIKE '%26.0090.11%'
    ORDER BY dc_code

План выполнения full scan таблицы.
Индекс по полю dc_code есть - unique.
В базе выполняется много таких запросов с большим количеством физических чтений, все время с разным LIKE.

CURSOR_SHARING=EXACT
6 апр 06, 14:51    [2532080]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с LIKE '%'  [new]
nata1111
Member

Откуда:
Сообщений: 1800
обычный индекс не поможет, можно посмотреть в сторону ctxsys.context, но запросы придется переписывать.
6 апр 06, 15:20    [2532287]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с LIKE '%'  [new]
Alex_D
Member

Откуда:
Сообщений: 988
Я подобного рода запрос с оптимизировал у себя следущим образом:

 SELECT /*+ CARDINALITY( ic 1) */ 
            i.dc_id, i.dc_code, i.dc_name, i.dc_atype, '' puid
    FROM invbook.inb_docs i,
            (select dc_code 
               from invbook.inb_docs
             where dc_code LIKE '%26.0090.11%') ic
    WHERE  i.dc_code = ic.dc_code   
     ORDER BY dc_code

Грубо говоря full scan таблицы заменил на full scan индекс.
6 апр 06, 15:54    [2532529]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с LIKE '%'  [new]
ПЕС
Guest
nata1111
обычный индекс не поможет, можно посмотреть в сторону ctxsys.context, но запросы придется переписывать



Connected.
|SQL>drop table t;

Table dropped.

|SQL>create table t as select * from dba_objects;

Table created.

|SQL>set autot traceonly exp
|SQL>SELECT  owner, status, object_name FROM T
  2  WHERE owner LIKE '%SYS%';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'T'



|SQL>CREATE INDEX i1 ON T(owner, status, object_name);

Index created.

|SQL>ANALYZE TABLE T COMPUTE STATISTICS;

Table analyzed.

|SQL>SELECT  owner, status, object_name FROM T
  2  WHERE owner LIKE '%SYS%';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=313 Bytes=8451)
   1    0   INDEX (FAST FULL SCAN) OF 'I1' (NON-UNIQUE) (Cost=5 Card=313 Bytes=8451)




to Roman Schepalov:
попробуйте создать индекс
create index i_1 on inb_docs(dc_id, dc_code, dc_name, dc_atype)

ну и статистику собрать потом...
6 апр 06, 15:56    [2532543]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с LIKE '%'  [new]
Ааз
Member

Откуда: Москва/Протвино
Сообщений: 4274
nata1111
обычный индекс не поможет, можно посмотреть в сторону ctxsys.context, но запросы придется переписывать.
И еще деньги доплачивать за Oracle Text ;-). Доменные индексы - направление верное для задачи общего типа. Однако если отдельные "поля" в этом коде имеют самостоятельное значение (например, то, что между двумя '.'), можно обойтись малой кровью - FBI (Function-Based Indexes).

Всего
6 апр 06, 17:02    [2533020]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить