У нас есть простой присоединиться заявление, в котором некоторые из когда положения могут превратиться в является нулевым. Оператор создается приложением. Проблема с планом запроса возникает, когда у нас есть это имеет значение.
Мы выполнили подход, описанный в статье на StackExchange, и создали составной индекс для столбцов - обнуляемый и тот, с которым мы соединяемся. Это помогает только при выборе только индексированных столбцов. Если мы выберем неиндексированные столбцы, он будет проигнорирован, а результат запроса будет таким же, например, ни один из выбранных строк.
Единственный вариант, который мы видим - изменить логику приложения, но может быть, есть еще способ решить эту проблему на уровне db?Композитный индекс игнорируется при выборе проиндексированных столбцов (Oracle)
--Illustrative sample. Prepare tables and indexes:
create table tableA
(
Acol1 varchar2(32) NOT NULL,
Acol2 varchar2(32),
Acol3 varchar2(32)
);
insert into tableA (Acol1, Acol2, Acol3)
values ('abcd1','abcd2A','abcd3A');
create table tableB
(
Bcol1 varchar2(32) NOT NULL,
Bcol2 varchar2 (32),
Bcol3 varchar2 (32)
);
insert into tableB (Bcol1, Bcol2, Bcol3)
values ('abcd1','abcd2B','abcd3B');
create index tableA_col12 on tableA (acol1, acol2);
create index tableB_col1 on tableB (Bcol1);
commit;
Затем мы проверяем планы:
1.
select a.Acol1 from tableA a join tableB b on a.Acol1 = b.Bcol1 where Acol2 is null;
--no rows selected
- Диапазон сканирования
2.
select * from tableA a join tableB b on a.Acol1 = b.Bcol1 where Acol2 is null;
--no rows selected
Plan2 (та же ссылка выше) - Сканирование полной таблицы
Каким будет лучший способ повысить производительность: изменить запросы, использовать более интеллектуальные индексы или применить фиксированный план?
* Обновление * Пока я готовил этот вопрос, план моего образца изменился сам по себе, теперь у нас есть Plan2* вместо Plan2 - нет полного сканирования таблицы. Однако, если я воссоздаю образец (распаковывают таблицы и готовят их снова) - план снова Plan2 (полноэкранное сканирование). Этот трюк не происходит в фактической БД.
Вот как жизнь для некоторых баз данных, если вы выберете столбцы не в индексе, он не будет использовать индекс - вы можете просто добавить свои столбцы в индекс и ускорить скорость. – Hogan
Ваши столы маленькие. План выполнения зависит от размера данных, поэтому на таких небольших объемах данных это бессмысленно. –
импортировать больше данных, вызывать dbms_stats.gather_schema_stats (USER); и см. изменения ... когда у вас есть только одна запись, самый быстрый способ просто загрузить таблицу в память и выполнить полное сканирование – are