Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несколько условий LIKE и NOT LIKE для одного столбца / 25 сообщений из 26, страница 1 из 2
06.02.2020, 13:05
    #39923351
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Здравствуйте! Подскажите пожалуйста можно ли как то оптимизировать данный запрос:
Код: 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
06.02.2020, 13:14
    #39923359
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
eliasum,

Вряд ли в comm_type используется перечисление одновременно mail-мэйл-факс, посему приведенное условие сводится к 1=1.
...
Рейтинг: 0 / 0
06.02.2020, 15:43
    #39923501
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Постройте полнотекстовый индекс...
...
Рейтинг: 0 / 0
07.02.2020, 07:19
    #39923732
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
А сколько строк в наборе данных / таблице?
...
Рейтинг: 0 / 0
07.02.2020, 07:30
    #39923735
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Можно так представить запрос, отвлеченно:
Код: 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
07.02.2020, 07:46
    #39923736
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
А почему ты думаешь, что его вообще оптимизировать надо?
Тем более на таком количестве строк
...
Рейтинг: 0 / 0
07.02.2020, 08:25
    #39923748
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Предположил для общего саморазвития))
...
Рейтинг: 0 / 0
07.02.2020, 11:07
    #39923815
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
На самом деле я действительно удивился, что оно занимает время
Немного странный тест, но уж какой есть
Код: 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
07.02.2020, 11:28
    #39923840
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
eliasum,

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

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


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

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


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


не будет использовать индекс.
Слишком категорично.
...
Рейтинг: 0 / 0
07.02.2020, 12:37
    #39923882
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
-2-
посему приведенное условие сводится к 1=1.
скорее к
Код: plsql
1.
COMM_TYPE is not null
...
Рейтинг: 0 / 0
07.02.2020, 13:35
    #39923920
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
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
07.02.2020, 13:37
    #39923922
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
MazoHist
Поэтому тут уже сказали

andrey_anonymous
Постройте полнотекстовый индекс...
Что бы ты не строил - от полного сканирования по not like не уйдешь.
...
Рейтинг: 0 / 0
07.02.2020, 15:47
    #39923978
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Кобанчег
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
07.02.2020, 15:49
    #39923979
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
вообще, если хочешь склеить мозг,
такую пачку лайков/нелайков только через или и клеить

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


Ну выдели.

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

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

Код: 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
07.02.2020, 17:44
    #39924008
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
А чтобы запихатьь все в 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
07.02.2020, 18:08
    #39924015
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Кстати, врядли 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
07.02.2020, 19:40
    #39924043
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
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
07.02.2020, 19:43
    #39924044
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Ну и главное: далеко ли мы ушли от LIKE перейдя к contains?
...
Рейтинг: 0 / 0
07.02.2020, 22:40
    #39924090
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
Тс запутался в or/and, а вы на полном серьёзе обсуждаете эту муть...
...
Рейтинг: 0 / 0
07.02.2020, 22:54
    #39924094
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько условий LIKE и NOT LIKE для одного столбца
xtender
Тс запутался в or/and, а вы на полном серьёзе обсуждаете эту муть...
народ нашёл пятничную задачу, ТС уже забыт
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несколько условий LIKE и NOT LIKE для одного столбца / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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