powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inner join on LIKE
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inner join on LIKE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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