powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inner join on LIKE
35 сообщений из 35, показаны все 2 страниц
Inner join on LIKE
    #39462153
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть две таблицы:
1) счета, 200+ млн строк, содержит номера счетов вида 1234657897946546, 12346578979465846, 479687465411647, ...
2) маски, 2 тыс строк, содержит маски вида 12345%, 66_45%, 7__78%

задача: получить счета, подходящие под маски, т.е. результат соединения "счета.номер_счета LIKE маски.маска"
это более 2/3 таблицы счетов (130+ млн строк)

проблема:
план запроса = 2 FTS + nested loops = очень долго

вопрос: как ускорить?
спасибо!
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462200
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexus12,

распараллелить, не?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462207
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,

Если маски ограничены по длине и всегда отвечают логике const% (т.е. нет масок %const%), то можно сгенерировать по ним все возможные варианты начала строки и соединять по substr.
Если номера счетов числовые, то substr особого выигрыша не даст. Тогда можно попробовать сгенерировать по маскам диапазоны.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462214
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,

Покажи результат по количеству масок в зависимости от фиксированных первых N цифр.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462215
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envсоединять по substrВ чем вариант соединения по substr даст выигрыш по сравнению с вариантом соединения по like?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462219
Alexus12,
Проверяли?:
create index ix_substring on TABLE (substr(COLUMN, 4, 9)) -- значения согласно условиям
или с использованием virtual columns
или просто substr.
LIKE Вы сознательно используете? Он НЕ использует индексы, как и написано в доке.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462230
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХунтаПиночетаОн НЕ использует индексы, как и написано в доке.Процитируй.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462234
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12получить счетаПолучить счета (один столбец) или получить все столбцы из таблицы счетов?
Alexus12план запроса = 2 FTS + nested loops = очень долгоЕсли количество запрашиваемых столбцов мало, то можно попробовать 1xIFFS (счета) + 1хFTS(маски) + Hash Join + Parallel(?)
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462238
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQL Hash Join Что хешировать для LIKE?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462243
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХунтаПиночета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.
set timing off

create table xyeta as
select
rpad(to_char(rownum), 20, '0') as account_number,
dbms_random.string('P', 100) as some_shit
from dual
connect by level <= 1e4;

Таблица создана.


create index  xyeta#account_number on xyeta(account_number);

Индекс создан.


set autotrace on

select *
from xyeta
where account_number like '1412419241241%';

строки не выбраны


План выполнения
----------------------------------------------------------
Plan hash value: 3721345436

----------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                      |     1 |  2014 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| XYETA                |     1 |  2014 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | XYETA#ACCOUNT_NUMBER |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

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

   2 - access("ACCOUNT_NUMBER" LIKE '1412419241241%')
       filter("ACCOUNT_NUMBER" LIKE '1412419241241%')

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


Статистика
----------------------------------------------------------
         11  recursive calls
          0  db block gets
         79  consistent gets
          1  physical reads
          0  redo size
        323  bytes sent via SQL*Net to client
        461  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed


drop table xyeta purge;

Таблица удалена.

...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462244
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-ORA__SQL Hash Join Что хешировать для LIKE?Добавить equi join из substr, если нет масок, начинающихся на %
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462249
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadenvсоединять по substrВ чем вариант соединения по substr даст выигрыш по сравнению с вариантом соединения по like?

По substr можно построить отдельный индекс на таблице счетов. Если маска фиксированной длины.

Если номера счетов числовые, тоже можно сделать индекс по substr.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462256
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLможно попробовать 1xIFFS (счета) + 1хFTS(маски) + Hash Join + Parallel(?)До кучи, напрашивается Partition
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462282
-1-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-1-
Гость
-2-Процитируй.
When we use LIKE with preceding % it always goes for full scan.
Index and LIKE Operator asktom.oracle.com
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462317
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-1--2-Процитируй.
When we use LIKE with preceding % it always goes for full scan.
Index and LIKE Operator asktom.oracle.com
Читаем по диагонали?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462319
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-1--2-Процитируй.
When we use LIKE with preceding % it always goes for full scan.
Index and LIKE Operator asktom.oracle.comасктом не документация и в начальном утверждении безусловное "НЕ использует".
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462323
-3-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-3-
Гость
-2--1-пропущено...

When we use LIKE with preceding % it always goes for full scan.
Index and LIKE Operator asktom.oracle.comасктом не документация .
откуда такая категоричность? Юношеский максимализм ?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462359
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХунтаПиночетаОн НЕ использует индексы, как и написано в доке.
категоричное утверждение с отсылкой к документации
-1-When we use LIKE with preceding %
упс, оказывается использует, кроме определённых условий
-1-asktom.oracle.com
дока?

Блоги Льюиса, Усольцева, Ахмадеева и т.д. тоже считать документацией? Ответы на sql.ru - тоже дока?
Книга фотошопа - тоже считается докой?
Или "всем должно быть очевидно", что мнение (пусть и очень профессиональное) одного сотрудника компании - это и есть документация?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462368
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь обратимся к доке
автор Pattern Matching on Indexed Columns

When you use LIKE to search an indexed column for a pattern, Oracle can use the index to improve performance of a query if the leading character in the pattern is not % or _. In this case, Oracle can scan the index by this leading character. If the first character in the pattern is % or _, then the index cannot improve performance because Oracle cannot scan the index.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462378
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envтеперь обратимся к доке
автор Pattern Matching on Indexed Columns

When you use LIKE to search an indexed column for a pattern, Oracle can use the index to improve performance of a query if the leading character in the pattern is not % or _. In this case, Oracle can scan the index by this leading character. If the first character in the pattern is % or _, then the index cannot improve performance because Oracle cannot scan the index.IFS и IFFS за scan the index не считается? :)
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462385
envУсольцева, Ахмадеева
что за женщины такие?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462387
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривошипно-шатунный механизмenvУсольцева, Ахмадеева
что за женщины такие?
Родительный падеж
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462500
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
номера счетов числовые? - нет, varchar
но индекса по номерам счетов нет и поставить нельзя

основной вопрос такой: если join по like, то hash / merge в принципе невозможен? т.е. план всегда будет nested loops?
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462514
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQL,

Это была цитата на фразу Он НЕ использует индексы, как и написано в доке.
Считается.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462520
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,

Почитай, например у Льюиса, как работает hash-join.

Но, ты можешь выйти на hash/merge генерацией всех возможных значений по маскам, при наличии ограничения на количество символов и их допустимые значения.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462522
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривошипно-шатунный механизм,

Т.е. кто такие книга и фотошопа - вопроса не возникло? Уже хорошо.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462537
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12индекса по номерам счетов нет и поставить нельзяИндексы и не нужны.
Alexus12основной вопрос такой: если join по like, то hash / merge в принципе невозможен? т.е. план всегда будет nested loops?Ну ты можешь попробовать merge только лучше не станет
join ... on value >= regexp_substr(mask, '[^%_]+') + filter by like

Так что там по поводу распределения масок?
Код: plsql
1.
2.
3.
4.
select length(fixed_mask) l, count(*) cnt
  from (select regexp_substr(mask, '[^%_]+') fixed_mask from t)
group by length(fixed_mask)
order by 1
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462538
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,

а если так ?
Код: plsql
1.
2.
select * from emp e
where exists (select 1 from dept d where e.ename like d.dname)



ps
я так понимаю, маски не пересекаются
......
stax
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462550
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..а если так ?Если много масок может соответсвовать и надо получить лишь факт наличия соответсвия, то будет лучше чем self join
(поскольку фильтр работает до нахождения первого соответствия), но не на порядки.
Если не более одной маски может соответсвовать, то производительность такая же как для self join.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462557
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..а если так ?Если много масок может соответсвовать и надо получить лишь факт наличия соответсвия, то будет лучше чем self join
(поскольку фильтр работает до нахождения первого соответствия), но не на порядки.
Если не более одной маски может соответсвовать, то производительность такая же как для self join.
self join ето?
Код: plsql
1.
select * from emp e,dept d where e.ename like d.dname



если маски пересекаются то ето будут разные запросы
при пересечении масок, надо убрать дубли и на 100млн ето наверное ощутимо

.....
stax
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462558
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..а если так ?Если много масок может соответсвовать и надо получить лишь факт наличия соответсвия, то будет лучше чем self join
(поскольку фильтр работает до нахождения первого соответствия), но не на порядки.
Если не более одной маски может соответсвовать, то производительность такая же как для self join.Даже если не более одной, чуть лучше self join по описанной причине.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39462565
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopdbms_photoshopпропущено...
Если много масок может соответсвовать и надо получить лишь факт наличия соответсвия, то будет лучше чем self join
(поскольку фильтр работает до нахождения первого соответствия), но не на порядки.
Если не более одной маски может соответсвовать, то производительность такая же как для self join.Даже если не более одной, чуть лучше self join по описанной причине.
я чуть не о том
если более одной, то надо distinct, иначе будут дубли
дистинкт для 130+ млн строк, имхо ето не мало

.....
stax
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39469728
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуру ASKTOM ответили
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9535219800346176907

что если есть возможность добавить доп.условие на равенство, например

subst(p,1,5) =substr(a,1,5)

то джойн будет выполняться как HASH

это сильно помогло ускорить запрос.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39469735
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,

Если б ты отвечал на вопросы тебе б и здесь ответили.
Я тебя спрашивал дважды про распределение, но ты, видимо, читаешь по диагонали.
...
Рейтинг: 0 / 0
Inner join on LIKE
    #39469743
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот ответ был дан сразу env-ом.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inner join on LIKE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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