Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / bind like column / 21 сообщений из 21, страница 1 из 1
03.11.2020, 19:09
    #40015007
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
-- Надо оптимизировать такоэ. Какие будут мысли?
select * from some_table t where t.txt is not null and :bind_val like '%' || UPPER(t.txt) || '%'

-- :bind_val в общем - это Varchar2(2000)
-- some_table.txt%type = Varchar2(100)
-- таблица растет и TABLE ACCESS FULL уже не радует:)
...
Рейтинг: 0 / 0
03.11.2020, 19:58
    #40015033
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
Oracle Text
...
Рейтинг: 0 / 0
03.11.2020, 20:29
    #40015046
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
andrey_anonymous
Oracle Text

Куда в этот запрос
Код: plsql
1.
select * from some_table t where t.txt is not null and :bind_val like '%' || UPPER(t.txt) || '%'


его приткнуть?

как оптимизировать tab_column like '%' || :sime_bind || '%' - я знаю. Надо наоборот. Если это можно с помощью Oracle Text сделать, подскажите как... не могу сообразить
...
Рейтинг: 0 / 0
03.11.2020, 20:32
    #40015048
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
...
Рейтинг: 0 / 0
03.11.2020, 20:57
    #40015055
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column


ОК. делаю индекс типа ctxsys.ctxrule и дальше с помощью matches(t.txt, :bind_val)....

А без Oracle Text никак? какой-нибудь хитрый функц. индекс?
...
Рейтинг: 0 / 0
03.11.2020, 21:15
    #40015059
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
...
Рейтинг: 0 / 0
03.11.2020, 21:34
    #40015064
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999
-- Надо оптимизировать такоэ. Какие будут мысли?
select * from some_table t where t.txt is not null and :bind_val like '%' || UPPER(t.txt) || '%'

vvp999

как оптимизировать tab_column like '%' || :sime_bind || '%' - я знаю. Надо наоборот

Это одинаковые ситуации.
И там и там IFS.
...
Рейтинг: 0 / 0
03.11.2020, 22:43
    #40015088
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999
-- Надо оптимизировать такоэ. Какие будут мысли?
select * from some_table t where t.txt is not null and :bind_val like '%' || UPPER(t.txt) || '%'

-- :bind_val в общем - это Varchar2(2000)
-- some_table.txt%type = Varchar2(100)
-- таблица растет и TABLE ACCESS FULL уже не радует:)


Т.е у вас в таблице словарь, и вам нужно найти все "слова" содержащиеся в длинной переменной? И при этом слова могут налезать друг на друга? Верно?

Например, в если :bind = "ФЛОРИДА", а в таблице находятся слова "лор", "флорида" и "да", вы все три строки хотите получить?
...
Рейтинг: 0 / 0
04.11.2020, 10:50
    #40015158
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
AlexFF__|
vvp999
-- Надо оптимизировать такоэ. Какие будут мысли?
select * from some_table t where t.txt is not null and :bind_val like '%' || UPPER(t.txt) || '%'

vvp999

как оптимизировать tab_column like '%' || :sime_bind || '%' - я знаю. Надо наоборот

Это одинаковые ситуации.
И там и там IFS.

index full scan?

Какой индекс покроет первую ситуацию, можете привести?
...
Рейтинг: 0 / 0
04.11.2020, 10:54
    #40015159
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
НеофитSQL


Например, в если :bind = "ФЛОРИДА", а в таблице находятся слова "лор", "флорида" и "да", вы все три строки хотите получить?


да, но не слова, а выражения (лат.+цифры+пробел_-)
...
Рейтинг: 0 / 0
04.11.2020, 12:15
    #40015182
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999,

Код: 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.
SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three



SQL> select  * from t where 'One or Two' like '%'||n||'%' and n is not null;

        ID N
---------- ----------
         1 One
         2 Two


Execution Plan
----------------------------------------------------------
Plan hash value: 3767525237

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |     8 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |     8 |     1   (0)| 00:00:01 |
|*  2 |   INDEX FULL SCAN           | I$T$N |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

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

   2 - filter('One or Two' LIKE '%'||"N"||'%' AND "N" IS NOT NULL)

SQL>



будет ли быстрее ifs хз, если таблица широкая то возможно и да

.....
stax
...
Рейтинг: 0 / 0
04.11.2020, 17:45
    #40015261
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999
НеофитSQL


Например, в если :bind = "ФЛОРИДА", а в таблице находятся слова "лор", "флорида" и "да", вы все три строки хотите получить?


да, но не слова, а выражения (лат.+цифры+пробел_-)


Самое быстрое из известных мне решений включает построение дерева вашего словаря.

Тогда все содержащиеся в :bind выражения находятся в один проход строки :bind.
Потребуется память, пропорциональная числу строк в базе (примерно 10-20 байт на строку).
Также скорость вставки новых строк уменьшится, по причине обновления дерева.

Однако это уже будет не SQL запрос, а совсем другой код.
...
Рейтинг: 0 / 0
04.11.2020, 18:58
    #40015281
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
НеофитSQL


Самое быстрое из известных мне решений включает построение дерева вашего словаря.


Опять изобретаем пилисипед? Как ты думаешь, что (и много другого) строит (и самое главное синхронизирует) Oracle Text?

SY.
...
Рейтинг: 0 / 0
04.11.2020, 22:32
    #40015345
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
SY
НеофитSQL


Самое быстрое из известных мне решений включает построение дерева вашего словаря.


Опять изобретаем пилисипед? Как ты думаешь, что (и много другого) строит (и самое главное синхронизирует) Oracle Text?

SY.


К сожалению, я ещё не знаю ответа на ваш вопрос.

Я посмотрел несколько примеров использования oracle text, и они все рашают задачу, не похожую на ту, что решает TC.

Впрочем, ТС уже так и сказал в одном из ранних сообщений.

В таблице всего одна колонка, плюс задана одна длинная переменная. Если кто-то из участников этой темы умел решать такую задачу через "оракл текст", непонятно что им мешает применить знания и написать 3-4 строчки, тем самым помочь ТС?

У ТС реальная задача, с виду простая но нестандартная, и похоже не из сферы задач, которую оракл текст предназначен решать. Если бы я знал как помочь, я бы помог.
...
Рейтинг: 0 / 0
06.11.2020, 11:54
    #40015888
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
Stax
vvp999,

Код: 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.
SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three



SQL> select  * from t where 'One or Two' like '%'||n||'%' and n is not null;

        ID N
---------- ----------
         1 One
         2 Two


Execution Plan
----------------------------------------------------------
Plan hash value: 3767525237

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |     8 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |     8 |     1   (0)| 00:00:01 |
|*  2 |   INDEX FULL SCAN           | I$T$N |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

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

   2 - filter('One or Two' LIKE '%'||"N"||'%' AND "N" IS NOT NULL)

SQL>



будет ли быстрее ifs хз, если таблица широкая то возможно и да

.....
stax

Да, да , вот хотя бы такое получить!
Какой индекс Вы создаете, можно DDL, пожалуйста?
...
Рейтинг: 0 / 0
06.11.2020, 11:57
    #40015889
vvp999
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
НеофитSQL

У ТС реальная задача, с виду простая но нестандартная, и похоже не из сферы задач, которую оракл текст предназначен решать. Если бы я знал как помочь, я бы помог.

Вначале мне все правильно подсказали и решение я быстро нашел
авторОК. делаю индекс типа ctxsys.ctxrule и дальше с помощью matches(t.txt, :bind_val)....

Решение не подходит потому, что я не могу добавлять ctxapp владельцу схемы, а без этого индекс типа ctxsys.ctxrule не создается. Т.ч. оракл текстом я пользоваться увы не могу.
...
Рейтинг: 0 / 0
06.11.2020, 12:59
    #40015913
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999,


Код: 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.
SQL> create index I$T$N on t(n);

Index created.

SQL> set autotrace on exp lines 111
SQL> select  * from t where 'One or Two' like '%'||n||'%' and n is not null;

        ID N
---------- ----------
         1 One
         2 Two


Execution Plan
----------------------------------------------------------
Plan hash value: 3767525237

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |     8 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |     8 |     1   (0)| 00:00:01 |
|*  2 |   INDEX FULL SCAN           | I$T$N |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

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

   2 - filter('One or Two' LIKE '%'||"N"||'%' AND "N" IS NOT NULL)

SQL>


ps
можно принудительно добавить хинт index(t I$T$N)
......
stax
...
Рейтинг: 0 / 0
06.11.2020, 14:30
    #40015961
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999
...
Да, да , вот хотя бы такое получить!
...

ну, на "большой таблице", желать себе index full scan я бы не отважился...
...
Рейтинг: 0 / 0
06.11.2020, 14:35
    #40015965
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
vvp999
Решение не подходит потому, что я не могу добавлять ctxapp владельцу схемы

А убедить того, кто может - не получится?
...
Рейтинг: 0 / 0
06.11.2020, 19:04
    #40016075
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
Я поигрался с MATCHES() немного, но у меня почему-то Оракл Текст мало находит.

Код: 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.
SQL> create table TSTRULES (val VARCHAR2(100));
Table created

SQL> insert into TSTRULES values('one');
1 row inserted

SQL> insert into TSTRULES values('two');
1 row inserted

SQL> insert into TSTRULES values('won');
1 row inserted

SQL> create index tstrules_idx on tstrules(val) indextype is ctxsys.ctxrule;
Index created

SQL> select * from tstrules;
VAL
-------
one
two
won

SQL> select * from tstrules where matches(val,'one two three') > 0;
VAL
--------
two

SQL> select * from tstrules where matches(val,'twotwo') > 0;
VAL
--------

SQL> select * from tstrules where matches(val,'twone') > 0;
VAL
--------


В первом запросе я ожидал "one,two", во втором "two", в третьем (если Оракл текст способен делать поиск с
перекрывающимися токенами) ожидал "one,two,won".

Как должно быть:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> select * from tstrules where 'one two three' like '%'|| val ||'%';
VAL
--------------------------------------------------------------------------------
one
two

SQL> select * from tstrules where 'twotwo' like '%'|| val ||'%';
VAL
--------------------------------------------------------------------------------
two

SQL> select * from tstrules where 'twone' like '%'|| val ||'%';
VAL
--------------------------------------------------------------------------------
one
two
won
...
Рейтинг: 0 / 0
06.11.2020, 20:41
    #40016109
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bind like column
Если к таблице можно добавить индексированную колонку для хэша, задача решается в PL/SQL за О(число совпадений).
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / bind like column / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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