У меня есть таблица с 5 миллионами + записей в базе данных Informix.Использование индексов (индексов?) В Informix DB
Это не фактический стол, но покажет проблему, с которой я столкнулся.
Таблица: продажа
Колонки: 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 строк - Правильно, я бы подумал, что это будет достаточно умен, чтобы это сделать?
Есть ли способ заставить базу данных использовать idx3 и idx4 при обработке второй части предложения WHERE?
Любые другие решения, не создающие новые индексы?
Спасибо.
Какую версию IDS вы используете? Ваша статистика достаточно актуальна? Вы посмотрели планы запросов с помощью SET EXPLAIN ON? –