Помощь в оптимизации запроса

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 " сканирует всю таблицу, что делает запрос не очень оптимальным. Можно ли как-нибудь оптимизировать его?
Anatoly B
Дата: 23.10.2015 12:09:46
Popipo,

Создать индексы по поисковым полям?
miksoft
Дата: 23.10.2015 12:11:41
Popipo,

select t1.*
from log t1, log t2
where t2.a=1 and t2.b=3 and t1.correlation_id=t2.correlation_id
ArtNick
Дата: 23.10.2015 12:14:21
Popipo
а " 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


Очень похоже на то что было у меня

Структуру таблицы с индексами в студию, планы запросов

К сожалению пока сижу на другой задачке, но в следующий раз подготовлю больше не такой абстрактной информации.
Да ну
Дата: 23.10.2015 13:58:49
Anatoly B
Popipo,

Создать индексы по поисковым полям?

И индекс по correlation_id заодно.