2015-11-09 3 views
1

У нас есть простой присоединиться заявление, в котором некоторые из когда положения могут превратиться в является нулевым. Оператор создается приложением. Проблема с планом запроса возникает, когда у нас есть это имеет значение.
Мы выполнили подход, описанный в статье на 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 

Plan1

- Диапазон сканирования

2.

select * from tableA a join tableB b on a.Acol1 = b.Bcol1 where Acol2 is null; 
--no rows selected 

Plan2 (та же ссылка выше) - Сканирование полной таблицы

Каким будет лучший способ повысить производительность: изменить запросы, использовать более интеллектуальные индексы или применить фиксированный план?

* Обновление * Пока я готовил этот вопрос, план моего образца изменился сам по себе, теперь у нас есть Plan2* вместо Plan2 - нет полного сканирования таблицы. Однако, если я воссоздаю образец (распаковывают таблицы и готовят их снова) - план снова Plan2 (полноэкранное сканирование). Этот трюк не происходит в фактической БД.

+1

Вот как жизнь для некоторых баз данных, если вы выберете столбцы не в индексе, он не будет использовать индекс - вы можете просто добавить свои столбцы в индекс и ускорить скорость. – Hogan

+5

Ваши столы маленькие. План выполнения зависит от размера данных, поэтому на таких небольших объемах данных это бессмысленно. –

+0

импортировать больше данных, вызывать dbms_stats.gather_schema_stats (USER); и см. изменения ... когда у вас есть только одна запись, самый быстрый способ просто загрузить таблицу в память и выполнить полное сканирование – are

ответ

0

Мое замечание было немного легкомысленным, поэтому я попытаюсь дать вам более подробную информацию. Вот некоторые общие советы для получения лучше на оптимизацию системы SQL и конкретные запросы

  • Прежде всего @GordonLinoff прав (как всегда), вы не получите ничего значимого из крошечного стола. Оптимизатор знает и будет работать по-другому.

  • Во-вторых, после у вас есть таблица достойного размера (по крайней мере 50k строк в зависимости от вашей памяти), вы должны убедиться, что вы бежите статистику по вами таблицы или оптимизатор (и индексов) просто не будет работать

  • В-третьих, вам нужно использовать инструменты, узнать, как понять план выполнения - вы не можете улучшить эти методы, не имея глубокого понимания того, что система сообщает вам. Современные базы данных SQL имеют инструменты, которые будут рассматривать запрос и предлагать индексы - использовать их, точно так же, как план выполнения, который вы можете многому научиться. Помните, что эти инструменты не являются надежными, вам нужно попробовать свои предложения и посмотреть, работают ли они.

  • Наконец, прочитайте много. Одним из источников, который, как мне кажется, особенно интересен, является пользователь stackoverflow Quassnoi, у которого есть блог на explainextended. Хотя не так активно недавно этот блог (и многие его ответы) довольно освещают, я ожидаю, что вы им понравитесь. Есть много блогов и книг о предмете, и каждый бит помогает.

В этом случае для большей таблицы, я думаю (и это есть предостережение Есть много вещей, о вашей БД и моделях данных, я не знаю) просто добавив несколько столбцов в индекс будут работать - - но используйте инструмент Oracle и посмотрите, что он предлагает. Попробуй это первым.

+0

Еще один хороший сайт, чтобы понять, как работают индексы: http://use-the-index-luke.com/ –