ta, tb
WHERE
ta.a BETWEEN tb.a and tb.b;
Таблица tb содержит диапазон UInt32 - a,b и соответствующие значение val. Ищем вхождение ta.a в диапазон и выводим результат.
Запрос чертовски тормозной... 1500 из ta записей за 5 минут. Размер tb - 3М записей.
Куда покопать? (словари смотрел - даипазоны не умеет, хотя есть хак. скорость сопоставима)
ну. запрос тормозной потому что сначала ta + tb JOIN делается в памяти а потом только фильтрация какой объем данных в tb в байтах несжатых?
если верить дбиверу 65мб, но это я так понимаю пожатых..
и как такое порешать? держать отдельную таблицу с хешами или типа того и обновлять ее по уникальным значениям из ta?
SELECT * FROM system.tables WHERE name='tb'
ну можно попробовать сделать из второй таблицы словарь и вместо JOIN через ta, tb делать SELECT ta.val, dictGet( ...) FROM ta WHERE ta.a BETWEEN dictGet() AND dictGet()
А чем не подошел словарь с range_hashed? https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-range_hashed-example-open-intervals
несколько лет назад у меня была похожая задача на другой БД. Я должен был определить какому оператору принадлежит огромный список телефонов. Была таблица с диапазонами. Все очень сильно тормозило. В итоге я пришел к такому решению. Диапазоны выпрямил скриптом была одна запись 212000 - 215000 Мухосрансктелеком стало много 212 Мухосрансктелеком 213 Мухосрансктелеком 214 Мухосрансктелеком 215 Мухосрансктелеком И уже с таким списком все работало быстро условие переписывается на = и индексы работают substring(mytel,1,3) = t.prefix
Спасибо за идею, оценю кол-во новых записей, может и выгорит.
Пробовал, возможно где-то косякнул - скорость сравнимая была. И грузился он очень долго..
По трем цифрам кода (ABC/DEF) сегодня нельзя определить оператора. Таблица Россвязи уходит вглубь до 5-6 знаков. Поэтому простой словарь будет слишком большим. Но range_hashed вполне нормальных размеров получается. У меня так: select dictGet('e164_ru','operator',toUInt64(7965),1234567); ключ - ABC/DEF код, диапазоны как у россвязи
это был пример приблизительный
Обсуждают сегодня