Popipo
Дата: 23.10.2015 12:06:53
Добрый день, задача в следующем.
Есть таблица пусть будет Log, в ней следующие поля
a, b, c, d, correlation_id
Моя задача вытащить все группы подходящие под фильтр, что это значит? Пусть я ищу строки с a=1, b=3, но кроме полученных строк мне хочется получить все строки у которых correlation_id равен полю correlation_id среди найденных строк. Рабочее решение это что-то вроде
select * from log where correlation_id in (
select correlation_id from log where a=1 and b=3)
но система под высокой нагрузкой и логи должны храниться как минимум несколько месяцев, то есть это около 1.5млрд записей, а " in " сканирует всю таблицу, что делает запрос не очень оптимальным. Можно ли как-нибудь оптимизировать его?
Popipo
Дата: 23.10.2015 12:22:56
|
---|
Создать индексы по поисковым полям? |
Попробую на тестовой среде, но подозреваю на продуктивной БД люди будут не очень рады простою дольше 10 часов
|
---|
select t1.*
from log t1, log t2
where t2.a=1 and t2.b=3 and t1.correlation_id=t2.correlation_id
|
Очень похоже на то что было у меня
|
---|
Структуру таблицы с индексами в студию, планы запросов
|
К сожалению пока сижу на другой задачке, но в следующий раз подготовлю больше не такой абстрактной информации.