У меня есть таблица с 5 миллионами + записей в базе данных Informix.
Это не фактическая таблица, но она покажет мою проблему.
Таблица: продажи
Столбцы: sale_id, sale_confirmed, vendor_id, purchaser_id
Индексы: idx1 (sale_id), idx2 (sale_confirmed), idx3 (vendor_id), idx4 (purchaser_id)
Если я сделаю запрос, подобный этому:
select *
from sales
where sale_confirmed IS NULL
or sale_confirmed = ''
затем запрос выполняется до завершения примерно через 4 или 5 секунд.
Если я выполняю запрос, подобный следующему:
select *
from sales
where vendor_id = 12345
or purchaser_id = 12345
, то запрос выполняется до завершения воколо 4 или 5 секунд.
Однако, если я выполню этот запрос (комбинацию из 2 предыдущих запросов):
select *
from sales
where (sale_confirmed IS NULL
or sale_confirmed = '' )
and (vendor_id = 12345
or purchaser_id = 12345)
, тогда запрос выполнялся в течение 15 минут, прежде чем я его отменил.
База данных, по-видимому, недостаточно умна, чтобы использовать разные индексы в тандеме, т. Е. Кажется, что она не может использовать idx2 для поиска числа X строк и использовать idx3 и idx4 в этом числе Xрядов - это правильно, я бы подумал, что это будет достаточно умен, чтобыo это?
Есть ли способ заставить базу данных использовать idx3 и idx4 при обработке второй части предложения WHERE?
Есть ли другие решения, кроме создания новых индексов?
Спасибо.