powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несколько условий LIKE и NOT LIKE для одного столбца
25 сообщений из 26, страница 1 из 2
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923351
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Подскажите пожалуйста можно ли как то оптимизировать данный запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
COMM_TYPE LIKE '%мобильный%' 
OR COMM_TYPE LIKE '%сотовый%' 
OR COMM_TYPE LIKE '%cell%' 
OR COMM_TYPE NOT LIKE '%mail%'
OR COMM_TYPE NOT LIKE '%мэйл%'
OR COMM_TYPE NOT LIKE '%факс%'  


Здесь COMM_TYPE - столбец таблицы
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923359
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum,

Вряд ли в comm_type используется перечисление одновременно mail-мэйл-факс, посему приведенное условие сводится к 1=1.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923501
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постройте полнотекстовый индекс...
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923732
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько строк в наборе данных / таблице?
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923735
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так представить запрос, отвлеченно:
Код: plsql
1.
2.
3.
4.
5.
6.
COMM_TYPE LIKE '%текст1%' 
OR COMM_TYPE LIKE '%текст2%' 
OR COMM_TYPE LIKE '%текст3%' 
OR COMM_TYPE NOT LIKE '%текст4%'
OR COMM_TYPE NOT LIKE '%текст5%'
OR COMM_TYPE NOT LIKE '%текст6%' 



строк в наборе данных / таблице - 13054
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923736
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему ты думаешь, что его вообще оптимизировать надо?
Тем более на таком количестве строк
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923748
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположил для общего саморазвития))
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923815
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле я действительно удивился, что оно занимает время
Немного странный тест, но уж какой есть
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
tst> set timing on
tst> select count(*) from values;

  COUNT(*)
----------
2658489984

Elapsed: 00:11:32.89
tst> select count(*) from values;

  COUNT(*)
----------
2658489984

Elapsed: 00:11:37.32
tst> select count(*) from values where value like '%mail%';

  COUNT(*)
----------
      6941

Elapsed: 00:06:27.47
tst> select count(*) from values where value like '%mail%' or value like '%phone%' or value like '%cell%'
  2  or value not like '% %' or value not like '%_%' or value not like '%mai%';

  COUNT(*)
----------
2627521076

Elapsed: 00:09:21.97

...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923840
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eliasum,

/*+ PARALLEL */
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923856
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eliasum,

запрос c условием
Код: plsql
1.
 COL_NAME LIKE '%.....' 


не будет использовать индекс. Поэтому тут уже сказали

andrey_anonymous
Постройте полнотекстовый индекс...


или изменением схемы данных (материализацией по этим условиям при вставке)
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923866
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHist
запрос c условием
Код: plsql
1.
 COL_NAME LIKE '%.....' 


не будет использовать индекс.
Слишком категорично.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923882
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-
посему приведенное условие сводится к 1=1.
скорее к
Код: plsql
1.
COMM_TYPE is not null
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923920
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eliasum,

если абстрагироваться от странностей фильтра, то можно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
create table tst as 
select 1 as id, 'abc мобильный asd' COMM_TYPE from dual union all
select 1 as id, 'abc сотовый asd' COMM_TYPE from dual union all
select 1 as id, 'abc cell asd' COMM_TYPE from dual union all
select 1 as id, 'abc mail asd' COMM_TYPE from dual union all
select 1 as id, 'abc мэйл asd' COMM_TYPE from dual union all
select 1 as id, 'abc факс asd' COMM_TYPE from dual union all
select 1 as id, 'abc другое asd' COMM_TYPE from dual;

CREATE INDEX tst_idx ON tst (case when COMM_TYPE LIKE '%мобильный%' OR COMM_TYPE LIKE '%сотовый%' OR COMM_TYPE LIKE '%cell%' then 1 end);

EXEC DBMS_STATS.gather_table_stats(USER, 'TST', cascade => TRUE);

select /*+ gather_plan_statistics */ * from tst where case when COMM_TYPE LIKE '%мобильный%' OR COMM_TYPE LIKE '%сотовый%' OR COMM_TYPE LIKE '%cell%' then 1 end = 1;
select * from     table (dbms_xplan.display_cursor (format=>'ALLSTATS LAST'));

SQL_ID  1wbw95cpmavuq, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ * from tst where case when 
COMM_TYPE LIKE '%мобильный%' OR COMM_TYPE LIKE '%сотовый%' OR COMM_TYPE 
LIKE '%cell%' then 1 end = 1
 
Plan hash value: 909325036
 
---------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |         |      1 |        |      3 |00:00:00.01 |       2 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TST     |      1 |      3 |      3 |00:00:00.01 |       2 |
|*  2 |   INDEX RANGE SCAN                  | TST_IDX |      1 |      3 |      3 |00:00:00.01 |       1 |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("TST"."SYS_NC00003$"=1)

...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923922
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHist
Поэтому тут уже сказали

andrey_anonymous
Постройте полнотекстовый индекс...
Что бы ты не строил - от полного сканирования по not like не уйдешь.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923978
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
MazoHist
Поэтому тут уже сказали

andrey_anonymous
Постройте полнотекстовый индекс...

Что бы ты не строил - от полного сканирования по not like не уйдешь.


А причем NOT LIKE если text index?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
SQL> create table quick
  2    (
  3      quick_id number primary key,
  4      text      varchar(80)
  5    );

Table created.

SQL> insert into quick ( quick_id, text )
  2    values ( 1, 'ABC XYZ1 DEF');

1 row created.

SQL> insert into quick ( quick_id, text )
  2    values ( 2, 'ABC XYZ DEF');

1 row created.

SQL> insert into quick ( quick_id, text )
  2    values ( 3, 'ABC 2XYZ DEF');

1 row created.

SQL> insert into quick ( quick_id, text )
  2    values ( 4, 'ABCXYZDEF');

1 row created.

SQL> insert into quick ( quick_id, text )
  2    values ( 5, 'ABRACADABRA');

1 row created.

SQL> commit;

Commit complete.

SQL> begin
  2      Ctx_Ddl.Create_Preference('wildcard_pref', 'BASIC_WORDLIST');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> create index wildcard_idx on quick(text)
  2      indextype is ctxsys.context
  3      parameters ('Wordlist wildcard_pref') ;

Index created.

SQL> select quick_id from quick
  2    where contains ( text, '%XYZ%' ) = 0;

  QUICK_ID
----------
         5

SQL> explain plan for
  2  select quick_id from quick
  3    where contains ( text, '%XYZ%' ) = 0;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 288021179

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |    67 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| QUICK        |     1 |    67 |     4   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | WILDCARD_IDX |       |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("CTXSYS"."CONTAINS"("TEXT",'%XYZ%')=0)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

18 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923979
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще, если хочешь склеить мозг,
такую пачку лайков/нелайков только через или и клеить

бр-р-р
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923991
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
А причем NOT LIKE если text index?
Мне выделить красненьким в запросе ТС потому что иначе не видно?
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39923998
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
SY
А причем NOT LIKE если text index?
Мне выделить красненьким в запросе ТС потому что иначе не видно?


Ну выдели.

SY.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924004
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

Может я что-то упустил, но:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
SQL> select  *
  2    from  quick;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL
         3 MOBILE FAX
         4 MOBILE MAIL
         5 ABRACADABRA

SQL> select * from quick
  2    where contains(text,'%MOBILE% OR %CELL%') > 0
  3      and contains(text,'%MAIL% OR %FAX%') = 0;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL

SQL> explain plan for
  2  select * from quick
  3    where contains(text,'%MOBILE% OR %CELL%') > 0
  4      and contains(text,'%MAIL% OR %FAX%') = 0;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 288021179

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |    67 |     4   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| QUICK        |     1 |    67 |     4   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | WILDCARD_IDX |       |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   1 - filter("CTXSYS"."CONTAINS"("TEXT",'%MOBILE% OR %CELL%')>0)
   2 - access("CTXSYS"."CONTAINS"("TEXT",'%MAIL% OR %FAX%')=0)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

SQL> select * from quick
  2    where contains(text,'%MAIL% OR %FAX%') = 0
  3      and contains(text,'%MOBILE% OR %CELL%') > 0;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL

SQL> explain plan for
  2  select * from quick
  3    where contains(text,'%MAIL% OR %FAX%') = 0
  4      and contains(text,'%MOBILE% OR %CELL%') > 0;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 288021179

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |    67 |     4   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| QUICK        |     1 |    67 |     4   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | WILDCARD_IDX |       |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   1 - filter("CTXSYS"."CONTAINS"("TEXT",'%MOBILE% OR %CELL%')>0)
   2 - access("CTXSYS"."CONTAINS"("TEXT",'%MAIL% OR %FAX%')=0)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924008
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чтобы запихатьь все в domain index:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SQL> select * from quick
  2    where contains(text,'(%MOBILE% OR %CELL%) MINUS (%MAIL% OR %FAX%)') > 0;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL

SQL> explain plan for
  2  select * from quick
  3    where contains(text,'(%MOBILE% OR %CELL%) MINUS (%MAIL% OR %FAX%)') > 0;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 288021179

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |    67 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| QUICK        |     1 |    67 |     4   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | WILDCARD_IDX |       |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("CTXSYS"."CONTAINS"("TEXT",'(%MOBILE% OR %CELL%) MINUS (%MAIL% OR
              %FAX%)')>0)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924015
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, врядли TC интересуют совпадeния/несовпадeния по части слова. Скажем 'WINE CELL AR', так-что:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
SQL> select * from quick;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL
         3 MOBILE FAX
         4 MOBILE MAIL
         5 ABRACADABRA
         6 WINE CELLAR

6 rows selected.

SQL> select * from quick
  2    where contains(text,'(MOBILE OR CELL) MINUS (MAIL OR FAX)') > 0;

  QUICK_ID TEXT
---------- --------------------------------------------------------------------------------
         1 MOBILE
         2 CELL

SQL> explain plan for
  2  select * from quick
  3    where contains(text,'(MOBILE OR CELL) MINUS (MAIL OR FAX)') > 0;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 288021179

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |    67 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| QUICK        |     1 |    67 |     4   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | WILDCARD_IDX |       |       |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("CTXSYS"."CONTAINS"("TEXT",'(MOBILE OR CELL) MINUS (MAIL OR FAX)')>0)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

18 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924043
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Чудес не бывает, для того, чтоб проверить НЕ вхождение надо прочитать ВСЁ.

Или если пойти от обратного, то сначала найти то, что не должно попасть, а потом вычитать всё остальное.

Или более конкретно, в приведённом примере, после создания индекса tokenized strings хранятся в DR$WILDCARD_IDX$I.

Добавим немного строк.

Код: plsql
1.
insert into quick select 1e3+rownum, 'qwerty'||rownum from dual connect by rownum <= 3e4;



Начнем с вхождений
Код: plsql
1.
2.
3.
4.
5.
SQL> select count(quick_id) c from quick where contains ( text, 'qwerty12%' ) > 0;

         C
----------
      1111




Теперь посмотрим НЕвхождения.
Код: plsql
1.
2.
3.
4.
5.
SQL> select count(quick_id) c from quick where contains ( text, 'qwerty12%' ) = 0;

         C
----------
     28894



А в это время под капотом...

Сначала выбираем токены удоветворяющие условию.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT/*+DYNAMIC_SAMPLING(0) INDEX(T "DR$WILDCARD_IDX$X")*/ DISTINCT 
  TOKEN_TEXT  FROM "DR$WILDCARD_IDX$I" T WHERE TOKEN_TEXT LIKE :lkexpr 
  ESCAPE '\' AND (TOKEN_TYPE = 0 OR TOKEN_TYPE = 4 OR (TOKEN_TYPE BETWEEN 16 
  AND 74)  OR (mod(TOKEN_TYPE, 10000) between 1001 and 1333))


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         10          0        1111
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0         10          0        1111

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 106     (recursive depth: 1)
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
      1111       1111       1111  SORT UNIQUE NOSORT (cr=10 pr=0 pw=0 time=1135 us starts=1 cost=75 size=47 card=1)
      1111       1111       1111   INDEX RANGE SCAN DR$WILDCARD_IDX$X (cr=10 pr=0 pw=0 time=513 us starts=1 cost=74 size=47 card=1)(object id 123448)



Потом для каждого отдельно выполняем запрос по нахождению rowid.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT /*+ DYNAMIC_SAMPLING(0) INDEX(i) */     TOKEN_FIRST,TOKEN_LAST,
  TOKEN_COUNT,ROWID     
FROM
 "DR$WILDCARD_IDX$I" i     WHERE TOKEN_TEXT = :word AND TOKEN_TYPE = 
  :wtype     ORDER BY TOKEN_TEXT, TOKEN_TYPE, TOKEN_FIRST


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute   1111      0.18       0.17          0          0          0           0
Fetch     1111      0.00       0.00          0       2229          0        1111
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     2223      0.18       0.18          0       2229          0        1111

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 106     (recursive depth: 1)
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         1          1          1  INDEX RANGE SCAN DR$WILDCARD_IDX$X (cr=2 pr=0 pw=0 time=14 us starts=1 cost=2 size=98 card=1)(object id 123448)



Потом читаем из таблицы все строки по rowid кроме найденных получаем 30005-1111=28895 строк.

Далее рассмотрим случаи когда НЕвхождение сужает число срок.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select count(quick_id) c from quick where contains ( text, 'qwerty1%' ) = 0;

         C
----------
     18894

SQL> select count(quick_id) c from quick where contains ( text, 'qwerty%' ) = 0;
select count(quick_id) c from quick where contains ( text, 'qwerty%' ) = 0
                              *
ERROR at line 1:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-51030: wildcard query expansion resulted in too many terms



ODCIIndexStart в зависимости от предиката может применять всякие изыски в динамически сгенерированном запросе, но иногда может не работать. :)
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924044
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и главное: далеко ли мы ушли от LIKE перейдя к contains?
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924090
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Тс запутался в or/and, а вы на полном серьёзе обсуждаете эту муть...
...
Рейтинг: 0 / 0
Несколько условий LIKE и NOT LIKE для одного столбца
    #39924094
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Тс запутался в or/and, а вы на полном серьёзе обсуждаете эту муть...
народ нашёл пятничную задачу, ТС уже забыт
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несколько условий LIKE и NOT LIKE для одного столбца
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]