powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / bind like column
21 сообщений из 21, страница 1 из 1
bind like column
    #40015007
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 уже не радует:)
...
Рейтинг: 0 / 0
bind like column
    #40015033
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Text
...
Рейтинг: 0 / 0
bind like column
    #40015046
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
bind like column
    #40015048
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
bind like column
    #40015055
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость


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

А без Oracle Text никак? какой-нибудь хитрый функц. индекс?
...
Рейтинг: 0 / 0
bind like column
    #40015059
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
bind like column
    #40015064
Фотография 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.
...
Рейтинг: 0 / 0
bind like column
    #40015088
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
bind like column
    #40015158
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
bind like column
    #40015159
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL


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


да, но не слова, а выражения (лат.+цифры+пробел_-)
...
Рейтинг: 0 / 0
bind like column
    #40015182
Фотография 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
...
Рейтинг: 0 / 0
bind like column
    #40015261
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vvp999
НеофитSQL


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


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


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

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

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


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


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

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


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


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

SY.


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

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

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

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

У ТС реальная задача, с виду простая но нестандартная, и похоже не из сферы задач, которую оракл текст предназначен решать. Если бы я знал как помочь, я бы помог.
...
Рейтинг: 0 / 0
bind like column
    #40015888
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
bind like column
    #40015889
vvp999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL

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

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

Решение не подходит потому, что я не могу добавлять ctxapp владельцу схемы, а без этого индекс типа ctxsys.ctxrule не создается. Т.ч. оракл текстом я пользоваться увы не могу.
...
Рейтинг: 0 / 0
bind like column
    #40015913
Фотография 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.
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
bind like column
    #40015961
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvp999
...
Да, да , вот хотя бы такое получить!
...

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

А убедить того, кто может - не получится?
...
Рейтинг: 0 / 0
bind like column
    #40016075
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я поигрался с 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
bind like column
    #40016109
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если к таблице можно добавить индексированную колонку для хэша, задача решается в PL/SQL за О(число совпадений).
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / bind like column
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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