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

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

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

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

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

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

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

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

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

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

Блоги Льюиса, Усольцева, Ахмадеева и т.д. тоже считать документацией? Ответы на sql.ru - тоже дока?
Книга фотошопа - тоже считается докой?
Или "всем должно быть очевидно", что мнение (пусть и очень профессиональное) одного сотрудника компании - это и есть документация?
...
Рейтинг: 0 / 0
30.05.2017, 14:50
    #39462368
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inner join on LIKE
теперь обратимся к доке
автор 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
30.05.2017, 14:56
    #39462378
ORA__SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inner join on LIKE
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
30.05.2017, 15:02
    #39462385
Inner join on LIKE
envУсольцева, Ахмадеева
что за женщины такие?
...
Рейтинг: 0 / 0
30.05.2017, 15:04
    #39462387
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inner join on LIKE
Кривошипно-шатунный механизмenvУсольцева, Ахмадеева
что за женщины такие?
Родительный падеж
...
Рейтинг: 0 / 0
30.05.2017, 16:33
    #39462500
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Inner join on LIKE
номера счетов числовые? - нет, varchar
но индекса по номерам счетов нет и поставить нельзя

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

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

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

Но, ты можешь выйти на hash/merge генерацией всех возможных значений по маскам, при наличии ограничения на количество символов и их допустимые значения.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inner join on LIKE / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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