Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Помогите советом, долго работает запрос и я не могу понять почему.
drop table e_test;
drop table e_test_group1;
drop table e_test_group2;
create table e_test(id number);
create table e_test_group1(id number, value clob);
create table e_test_group2(id number, value clob);
create index e_test_group1_vl on e_test_group1(value) INDEXTYPE IS CTXSYS.CONTEXT;
create index e_test_group2_vl on e_test_group2(value) INDEXTYPE IS CTXSYS.CONTEXT;
insert into e_test(id) select level from dual connect by level<5000;
insert into e_test_group1(id) select level from dual connect by level<5000;
commit;
set timing on;
alter session set timed_statistics=true;
alter session set tracefile_identifier='test';
alter session set events '10046 trace name context forever, level 12';
SELECT * FROM E_TEST
 WHERE 
  ((EXISTS
        (SELECT e_test_group1.ID
              FROM e_test_group1
             WHERE e_test_group1.ID = e_test.ID
               AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0)))))  or
       ((EXISTS
        (SELECT e_test_group2.ID
              FROM e_test_group2
             WHERE e_test_group2.ID = e_test.ID
               AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))));
alter session set events '10046 trace name context off';


Select выполняется 11,482 секунды, при этом в таблице e_test_group2 ноль записей! Поле value в e_test_group1 вообще пустое. Чего он так долго ищет?

План запроса:

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 487 | 6331 | 5 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | E_TEST | 4999 | 64987 | 5 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP1 | 1 | 2027 | 4 (0)| 00:00:01 |
|* 4 | DOMAIN INDEX | E_TEST_GROUP1_VL | | | 4 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | E_TEST_GROUP2 | 1 | 2027 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter( EXISTS (SELECT 0 FROM "E_TEST_GROUP1" "E_TEST_GROUP1" WHERE
"CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0 AND "E_TEST_GROUP1"."ID"=:B1)
OR EXISTS (SELECT 0 FROM "E_TEST_GROUP2" "E_TEST_GROUP2" WHERE "E_TEST_GROUP2"."ID"=:B2
AND "CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0))
3 - filter("E_TEST_GROUP1"."ID"=:B1)
4 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0)
5 - filter("E_TEST_GROUP2"."ID"=:B1 AND "CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%
ПОИСК%')>0)
Note
-----
- dynamic sampling used for this statement
28 rows selected

Необработанный файл трассировки 20Мб, можно скачать тут: https://docs.google.com/file/d/0B4TYexnuZ-gVRUNGcEk1YWRNZVU/edit?usp=sharing

Обработанный файл с sys=no приложил к сообщению.

В необработанном файле трассировки очень много похожих записей:

PARSING IN CURSOR #47 len=237 dep=1 uid=1530 oct=3 lid=1530 tim=1349217434560475 hv=1735777261 ad='2ee09c60'
SELECT /*+ DYNAMIC_SAMPLING(0) INDEX(i) */ TOKEN_FIRST,TOKEN_LAST,TOKEN_COUNT,ROWID FROM "SCHEMA"."DR$E_TEST_GROUP1_VL$I" i WHERE TOKEN_TEXT = :word AND TOKEN_TYPE = :wtype ORDER BY TOKEN_TEXT, TOKEN_TYPE, TOKEN_FIRST
END OF STMT
PARSE #47:c=0,e=16,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1349217434560473
BINDS #47:
kkscoacd
Bind#0
oacdty=01 mxl=32(12) mxlc=00 mal=00 scl=00 pre=00
oacflg=00 fl2=0000 frm=01 csi=873 siz=56 off=0
kxsbbbfp=7f371ae3fb90 bln=32 avl=12 flg=05
value="%ПОИСК%"
Bind#1
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=00 fl2=0000 frm=00 csi=00 siz=0 off=32
kxsbbbfp=7f371ae3fbb0 bln=22 avl=01 flg=01
value=0
EXEC #47:c=0,e=159,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,tim=1349217434560702
FETCH #47:c=0,e=13,p=0,cr=1,cu=0,mis=0,r=0,dep=1,og=1,tim=1349217434560742
STAT #47 id=1 cnt=0 pid=0 pos=1 obj=5347363 op='INDEX RANGE SCAN DR$E_TEST_GROUP1_VL$X (cr=1 pr=0 pw=0 time=13 us)'

Заранее большое спасибо!

К сообщению приложен файл (test2.txt - 32Kb) cкачать
12 окт 13, 21:36    [14961541]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Kamael
Member

Откуда: Алмата
Сообщений: 374
Заботин А.,
Соберите статистику по таблице E_TEST_GROUP1
Обработанного трейса не видать.
13 окт 13, 11:20    [14962560]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Kamael, сбор статистики не помогает
SQL> drop table e_test;
Table dropped
SQL> drop table e_test_group1;
Table dropped
SQL> drop table e_test_group2;
Table dropped
SQL> create table e_test(id number);
Table created
SQL> create table e_test_group1(id number, value clob);
Table created
SQL> create table e_test_group2(id number, value clob);
Table created
SQL> create index e_test_group1_vl on e_test_group1(value) INDEXTYPE IS CTXSYS.CONTEXT;
Index created
SQL> create index e_test_group2_vl on e_test_group2(value) INDEXTYPE IS CTXSYS.CONTEXT;
Index created
SQL> insert into e_test(id) select level from dual connect by level<5000;
4999 rows inserted
SQL> insert into e_test_group1(id) select level from dual connect by level<5000;
4999 rows inserted
SQL> commit;
Commit complete
SQL> alter session set timed_statistics=true;
Session altered
SQL> alter session set tracefile_identifier='test';
Session altered
SQL> begin
  2    DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'SCHEMA', TABNAME => 'E_TEST');
  3    DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'SCHEMA', TABNAME => 'E_TEST_GROUP1');
  4    DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'SCHEMA', TABNAME => 'E_TEST_GROUP2');
  5    DBMS_STATS.GATHER_INDEX_STATS (OWNNAME => 'SCHEMA', indname => 'E_TEST_GROUP1_VL');
  6    DBMS_STATS.GATHER_INDEX_STATS (OWNNAME => 'SCHEMA', indname => 'E_TEST_GROUP2_VL');
  7  end;
  8  /
PL/SQL procedure successfully completed
SQL> set timing on;
SQL> alter session set events '10046 trace name context forever, level 12';
Session altered
Executed in 0 seconds
SQL> SELECT * FROM E_TEST
  2   WHERE
  3    ((EXISTS
  4          (SELECT e_test_group1.ID
  5                FROM e_test_group1
  6               WHERE e_test_group1.ID = e_test.ID
  7                 AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0)))))  or
  8         ((EXISTS
  9          (SELECT e_test_group2.ID
 10                FROM e_test_group2
 11               WHERE e_test_group2.ID = e_test.ID
 12                 AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))));
        ID
----------
Executed in 24,883 seconds
SQL> alter session set events '10046 trace name context off';


Сейчас 24 секунды, т.к. запускаю на виртуальной машине и сейчас она чем-то подзагружена. Вот ещё вывод автотрейса:
Statistics
----------------------------------------------------------
179964 recursive calls
0 db block gets
130014 consistent gets
0 physical reads
0 redo size
237 bytes sent via SQL*Net to client
339 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed

Kamael
Обработанного трейса не видать.

А вон в первом сообщении приложен файл test2.txt, это и есть обработанный трейс.
13 окт 13, 20:35    [14963433]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Вот вроде всё подготовил, всего-то взять, скопировать-вставить и посмотреть что и как. Трейс приложил, план. Но нет - тишина, никто не хочет помочь, только один Kamael откликнулся. Где же остальные? Проверьте у себя - медленно работает! Я на нескольких серверах попробовал. Быстрее 3 секунд не было, а всего-то таблица в 10000 строк.
14 окт 13, 17:46    [14968738]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Rb-Sr
Member

Откуда:
Сообщений: 296
Заботин А.,
Не у всех под рукой настроенный Oracle Text, наверное.

У еня выполняется за 7 сек. 11.2.0.3
14 окт 13, 17:59    [14968852]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Rb-Sr
Member

Откуда:
Сообщений: 296
Rb-Sr,
Под SYSTEM-ом 8 сек:
+
system@DEV> SELECT * FROM E_TEST
2 WHERE
3 ((EXISTS
4 (SELECT e_test_group1.ID
5 FROM e_test_group1
6 WHERE e_test_group1.ID = e_test.ID
7 AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0))))) or
8 ((EXISTS
9 (SELECT e_test_group2.ID
10 FROM e_test_group2
11 WHERE e_test_group2.ID = e_test.ID
12 AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))));

no rows selected

Elapsed: 00:00:08.99

Execution Plan
----------------------------------------------------------
Plan hash value: 3687911287

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 487 | 1948 | 4 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | E_TEST | 4999 | 19996 | 4 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP1 | 1 | 4 | 1 (0)| 00:00:01 |
|* 4 | DOMAIN INDEX | E_TEST_GROUP1_VL | | | 1 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP2 | 1 | 2027 | 1 (0)| 00:00:01 |
|* 6 | DOMAIN INDEX | E_TEST_GROUP2_VL | | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter( EXISTS (SELECT 0 FROM "E_TEST_GROUP1" "E_TEST_GROUP1" WHERE
"CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0 AND "E_TEST_GROUP1"."ID"=:B1)
OR EXISTS (SELECT 0 FROM "E_TEST_GROUP2" "E_TEST_GROUP2" WHERE
"CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0 AND "E_TEST_GROUP2"."ID"=:B2))
3 - filter("E_TEST_GROUP1"."ID"=:B1)
4 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0)
5 - filter("E_TEST_GROUP2"."ID"=:B1)
6 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0)


Statistics
----------------------------------------------------------
169966 recursive calls
0 db block gets
110011 consistent gets
0 physical reads
0 redo size
248 bytes sent via SQL*Net to client
349 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed


Под обычным пользователем - 4 сек.
+

user@DEV> SELECT * FROM E_TEST
2 WHERE
3 ((EXISTS
4 (SELECT e_test_group1.ID
5 FROM e_test_group1
6 WHERE e_test_group1.ID = e_test.ID
7 AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0))))) or
8 ((EXISTS
9 (SELECT e_test_group2.ID
10 FROM e_test_group2
11 WHERE e_test_group2.ID = e_test.ID
12 AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))));

no rows selected

Elapsed: 00:00:04.13

Execution Plan
----------------------------------------------------------
Plan hash value: 3687911287

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 487 | 1948 | 4 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | E_TEST | 4999 | 19996 | 4 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP1 | 1 | 4 | 1 (0)| 00:00:01 |
|* 4 | DOMAIN INDEX | E_TEST_GROUP1_VL | | | 1 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP2 | 1 | 2027 | 1 (0)| 00:00:01 |
|* 6 | DOMAIN INDEX | E_TEST_GROUP2_VL | | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter( EXISTS (SELECT 0 FROM "E_TEST_GROUP1" "E_TEST_GROUP1" WHERE
"CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0 AND "E_TEST_GROUP1"."ID"=:B1)
OR EXISTS (SELECT 0 FROM "E_TEST_GROUP2" "E_TEST_GROUP2" WHERE
"CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0 AND "E_TEST_GROUP2"."ID"=:B2))
3 - filter("E_TEST_GROUP1"."ID"=:B1)
4 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0)
5 - filter("E_TEST_GROUP2"."ID"=:B1)
6 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0)


Statistics
----------------------------------------------------------
80534 recursive calls
0 db block gets
30900 consistent gets
0 physical reads
0 redo size
248 bytes sent via SQL*Net to client
349 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed


Разница в consistent gets
14 окт 13, 18:23    [14968938]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
В чем может быть причина?
14 окт 13, 22:01    [14969719]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Rb-Sr
Member

Откуда:
Сообщений: 296
Заботин А.,

Все время уходит на процессор, причина в запросе вероятно.

Так можно переписать?

 select * from e_test
     where
       exists
            (
             select 
               e_test_group1.id
             from
               e_test_group1
             where
               e_test_group1.id = e_test.id
             and 
              contains(e_test_group1.value, '%ПОИСК%') > 0
             union all
             select 
               e_test_group2.id
             from
               e_test_group2
             where 
               e_test_group2.id = e_test.id
             and 
              contains(e_test_group2.value, '%ПОИСК%') > 0
             );
15 окт 13, 11:16    [14971402]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Игорь Ковалев
Member

Откуда:
Сообщений: 57
Если вот так переписать вроде побыстрее работает
SELECT * FROM E_TEST WHERE ROWID IN
(SELECT rowid RID FROM E_TEST
    WHERE
      ((EXISTS
            (SELECT e_test_group1.ID
                  FROM e_test_group1
                 WHERE e_test_group1.ID = e_test.ID
                   AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0))))) 
UNION ALL
SELECT ROWID RID  FROM E_TEST 
    WHERE                           
       ((EXISTS
           (SELECT e_test_group2.ID
                 FROM e_test_group2
                WHERE e_test_group2.ID = e_test.ID
                  AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0))))))
15 окт 13, 13:47    [14972825]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
svavka
Member

Откуда:
Сообщений: 26
Не хватает индекса на id в таблицах e_test_groupX_vl, с ними поиск упростится
15 окт 13, 15:49    [14973957]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Переписать запрос нельзя, т.к. он строится автоматически. Так-то руками я тоже пробовал, действительно легко переписать чтоб быстро работал. Но хотелось бы разобраться в причине.

svavka
Не хватает индекса на id в таблицах e_test_groupX_vl, с ними поиск упростится

Несильно помогает, к сожалению.
16 окт 13, 21:15    [14982692]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Заботин А.,

так сделай:
SELECT * FROM E_TEST
 WHERE 
  e_test.ID in 
      (     SELECT--+ unnest
                  e_test_group1.ID
              FROM e_test_group1
             WHERE CONTAINS(e_test_group1.value, '%ПОИСК%') > 0
            union all
            SELECT
                  e_test_group2.ID
              FROM e_test_group2
             WHERE CONTAINS(e_test_group2.value, '%ПОИСК%') > 0
      );

no rows selected

Elapsed: 00:00:00.03

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name             | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                  |      1 |        |       |     6 (100)|          |      0 |00:00:00.01 |       4 |       |       |          |
|*  1 |  HASH JOIN                      |                  |      1 |      2 |    34 |     6  (17)| 00:00:01 |      0 |00:00:00.01 |       4 |   842K|   842K|  196K (0)|
|   2 |   VIEW                          | VW_NSO_1         |      1 |      2 |    26 |     0   (0)|          |      0 |00:00:00.01 |       4 |       |       |          |
|   3 |    HASH UNIQUE                  |                  |      1 |      2 |  2031 |     0   (0)|          |      0 |00:00:00.01 |       4 |   678K|   678K|          |
|   4 |     UNION-ALL                   |                  |      1 |        |       |            |          |      0 |00:00:00.01 |       4 |       |       |          |
|   5 |      TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP1    |      1 |      1 |     4 |     0   (0)|          |      0 |00:00:00.01 |       4 |       |       |          |
|*  6 |       DOMAIN INDEX              | E_TEST_GROUP1_VL |      1 |        |       |     0   (0)|          |      0 |00:00:00.01 |       4 |       |       |          |
|   7 |      TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP2    |      1 |      1 |  2027 |     0   (0)|          |      0 |00:00:00.01 |       0 |       |       |          |
|*  8 |       DOMAIN INDEX              | E_TEST_GROUP2_VL |      0 |        |       |     0   (0)|          |      0 |00:00:00.01 |       0 |       |       |          |
|   9 |   TABLE ACCESS FULL             | E_TEST           |      0 |   4999 | 19996 |     5   (0)| 00:00:01 |      0 |00:00:00.01 |       0 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 окт 13, 22:35    [14982867]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Заботин А.,

+ то есть так
SELECT * FROM E_TEST
 WHERE 
  ((EXISTS
        (SELECT/*+ unnest */ e_test_group1.ID
              FROM e_test_group1
             WHERE e_test_group1.ID = e_test.ID
               AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0)))))  or
       ((EXISTS
        (SELECT e_test_group2.ID
              FROM e_test_group2
             WHERE e_test_group2.ID = e_test.ID
               AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))))

основная проблема в том, что стоимость плана с фильтром у него 5, а c hash join и одноразовым поиском 6. Подправь вручную статистику и будет выбирать правильный план
16 окт 13, 22:46    [14982912]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
мда, подправить хорошо под эти индексы проблематично оказалось. проще вышло с удалением оной:
+
SQL> analyze index e_test_group1_vl delete statistics;

Index analyzed.

SQL> explain plan for
  2  SELECT * FROM E_TEST
  3   WHERE
  4    ((EXISTS
  5          (SELECT e_test_group1.ID
  6                FROM e_test_group1
  7               WHERE e_test_group1.ID = e_test.ID
  8                 AND ((CONTAINS(e_test_group1.value, '%ПОИСК%') > 0)))))  or
  9         ((EXISTS
 10          (SELECT e_test_group2.ID
 11                FROM e_test_group2
 12               WHERE e_test_group2.ID = e_test.ID
 13                 AND ((CONTAINS(e_test_group2.value, '%ПОИСК%') > 0)))));

Explained.

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3103826232

---------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                  |     3 |    51 |    10  (10)| 00:00:01 |
|*  1 |  HASH JOIN RIGHT SEMI          |                  |     3 |    51 |    10  (10)| 00:00:01 |
|   2 |   VIEW                         | VW_SQ_1          |     3 |    39 |     4   (0)| 00:00:01 |
|   3 |    UNION-ALL                   |                  |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP2    |     1 |  2027 |     0   (0)| 00:00:01 |
|*  5 |      DOMAIN INDEX              | E_TEST_GROUP2_VL |       |       |     0   (0)| 00:00:01 |
|   6 |     TABLE ACCESS BY INDEX ROWID| E_TEST_GROUP1    |     2 |     8 |     4   (0)| 00:00:01 |
|*  7 |      DOMAIN INDEX              | E_TEST_GROUP1_VL |       |       |     4   (0)| 00:00:01 |
|   8 |   TABLE ACCESS FULL            | E_TEST           |  4999 | 19996 |     5   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("VW_COL_1"="E_TEST"."ID")
   5 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP2"."VALUE",'%ПОИСК%')>0)
   7 - access("CTXSYS"."CONTAINS"("E_TEST_GROUP1"."VALUE",'%ПОИСК%')>0)

22 rows selected.
16 окт 13, 23:03    [14982953]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Спасибо, попробую!
18 окт 13, 11:32    [14996662]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
В версии Oracle Database 11g Release 11.2.0.3.0 всё очень быстро и прекрасно работает.
20 окт 13, 19:23    [15005033]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Заботин А.,

С правкой статистики? А на каких проблемы остались?
20 окт 13, 20:09    [15005111]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Нет, без всяких правок, вот прямо мой пример из первого сообщения выполняется за 0,3 секунды.
Плохо работает на Oracle Database 10g Release 10.2.0.5.0
21 окт 13, 14:01    [15008078]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Заботин А.
Member

Откуда: Санкт-Петербург
Сообщений: 155
Rb-Sr
Заботин А.,
Не у всех под рукой настроенный Oracle Text, наверное.

У еня выполняется за 7 сек. 11.2.0.3

Правда вот у Rb-Sr не так быстро получилось.
21 окт 13, 14:03    [15008091]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Заботин А.,

покажи план с 11.2.0.3. а на 10.2.0.5 попробуй собрать статистику по таблицам и удалить по индексу
21 окт 13, 14:14    [15008176]     Ответить | Цитировать Сообщить модератору
 Re: Медленно выполняется запрос с подзапросами, в которых ищется по Oracle Text  [new]
Kamael
Member

Откуда: Алмата
Сообщений: 374
Заботин А.,
с индексом на E_TEST(ID) выполняется за 0.078сек.
без индекса(E_TEST(ID)) 18сек.
без статистики для индексов E_TEST_GROUP1_VL,E_TEST_GROUP2_VL 8сек
11.2.0.1.0
21 окт 13, 15:20    [15008840]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить