Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 JOIN по строковым полям. Как ускорить запрос?  [new]
Mapuo
Member

Откуда:
Сообщений: 101
Доброго времени суток.
Есть 2 таблицы IMEI и TAC. 2,5 КК записей и 100 К записей соответственно.
Запрос:
select imei.subs_id     as subs_id     ,
       tac.manufactuter as manufacturer,
       tac.device_name  as device
from unv_subsk.subs_imei_20121119 imei,
     unv_subsk.tac_codes          tac
where imei.imei like tac.tac_code||'%'

Обещает работать 30 лет и три года... подскажите как можно ускорить?

К сообщению приложен файл. Размер - 36Kb
20 ноя 12, 08:58    [13498266]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Mapuo,

А на imei индекс есть? Вообще если taccode одинаковой длины то лучше, наверное, хэш джойн былбы с сабстром
20 ноя 12, 09:07    [13498286]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Mapuo
подскажите как можно ускорить?
Индекс пробовали создать?
20 ноя 12, 09:08    [13498289]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
Mapuo
Member

Откуда:
Сообщений: 101
tac_code различной длинны.
Индексов нет, сейчас создам, отпишу по результату.
20 ноя 12, 09:10    [13498293]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
Mapuo
Member

Откуда:
Сообщений: 101
Вопрос снимается!
Переписал через:
substr(imei.imei,1,8) = tac.tac_code

Прогнал несколько раз для всех вариантов длинны tac_code. За пару секунд отработало.
-------------
Индекс, кстати, не помог никак.
20 ноя 12, 09:22    [13498343]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Mapuo
Вопрос снимается!
Переписал через:
substr(imei.imei,1,8) = tac.tac_code


Прогнал несколько раз для всех вариантов длинны tac_code. За пару секунд отработало.
-------------
Индекс, кстати, не помог никак.
что значит для всех вариантов длины? Вместо одного запроса на кучу разбили где в сабстре меняете 8 на следующую длину?
20 ноя 12, 10:24    [13498636]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
Добрый Э - Эх
Guest
Mapuo
Обещает работать 30 лет и три года... подскажите как можно ускорить?
Постараться заставить оптимизатор использовать MERGE JOIN вместо NESTED LOOPS...

А в целом, если задача из разряда "телефонного биллинга" (поиск направления с максимальной длиной префикса по номеру В), то можно использовать многократный JOIN по substr-у с дальнейшим COALESCE в select-листе
20 ноя 12, 10:37    [13498708]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по строковым полям. Как ускорить запрос?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Добрый Э - Эх,

не, у tac поиска по максимальной длине не должно быть
20 ноя 12, 10:40    [13498733]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить