Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизРучное планирование запросов Найти похожие ветки
← →
Дмитрий_Б (2005-05-30 13:51) [0]Здравстуйте. Скажу сразу - я не профессиональный программист, возможно вопрос покажется простым.
Есть простой запрос:
select i.name, sum(n.kolv_prin), sum(n.summa)
from izdel i
inner join nakl_list nl on (i.id = nl.id_izdel)
inner join naklad n on (n.id_nakl = nl.id)
where (nl.data_nakl>=:dat_first)and(nl.data_nakl<=:dat_last)
group by i.name
order by i.name
(Список изделий, их количество и стоимость по накладным)
Индексы созданы по всем полям участвующим в соединении (on ...), всё это поля INTEGER.
После выполнения запроса IBExpert выдает такой план:
PLAN SORT (JOIN (N NATURAL,NL INDEX (RDB$PRIMARY3),I INDEX (RDB$PRIMARY1)))
т.е. по таблице NAKLAD используется полный перебор, хотя по полю NAKLAD.ID_NAKL создан
индекс (название его NAKLAD_IDX1)
Если указать план запроса явно:
select i.name, sum(n.kolv_prin), sum(n.summa)
from izdel i
inner join nakl_list nl on (i.id = nl.id_izdel)
inner join naklad n on (n.id_nakl = nl.id)
where (nl.data_nakl>=:dat_first)and(nl.data_nakl<=:dat_last)
group by i.name
PLAN SORT (JOIN (N INDEX (NAKLAD_IDX1),NL INDEX (RDB$PRIMARY3),I INDEX (RDB$PRIMARY1)))
order by i.name
IBExpert выдает следующее:
index NAKLAD_IDX1 cannot be used in the specified plan.
Вопрос такой: почему NAKLAD_IDX1 не может быть использован в данном плане ? Заранее спасибо, ответы посмотрю только завтра.
← →
DSKalugin © (2005-05-30 14:07) [1]надо было сюда еще привести определение(скрипты) всех индексов и таблиц. Возможно оптимизатору мешают другие индексы.
Без этого причину установить точно нельзя. Все советы будут или трепом или попаданием пальцем в небо
по i.name тоже должен быть индекс
т.к. он принимает участие в сортировке
where лучше переписать с использованием BETWEEN
он быстрей выполняется в данном случае
← →
Desdechado © (2005-05-30 15:24) [2]попробуй INNER JOIN заменить на простое условие во WHERE
← →
Petr V. Abramov © (2005-05-30 15:58) [3]> Вопрос такой: почему NAKLAD_IDX1 не может быть использован в данном плане ?
select count(distinct data_nakl)/count(*)
from naklad n
если близко к 0.5, тогда это ответ на вопрос
может быть, что в таблице мало записей, а блок большой, тогда индекс просто не нужен
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c