![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ручное планирование запросов [D7, IB6.x, FB 1.5]
Дмитрий_Б © (2005-05-30 13:51:00)Здравстуйте. Скажу сразу - я не профессиональный программист, возможно вопрос покажется простым.
Есть простой запрос:
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 не может быть использован в данном плане ? Заранее спасибо, ответы посмотрю только завтра.
Petr V. Abramov (2005-05-30 15:58:00) [1]> Вопрос такой: почему NAKLAD_IDX1 не может быть использован в данном плане ?
select count(distinct data_nakl)/count(*)
from naklad n
если близко к 0.5, тогда это ответ на вопрос
может быть, что в таблице мало записей, а блок большой, тогда индекс просто не нужен
Desdechado (2005-05-30 15:24:00) [2]попробуй INNER JOIN заменить на простое условие во WHERE
DSKalugin (2005-05-30 14:07:00) [3]надо было сюда еще привести определение(скрипты) всех индексов и таблиц. Возможно оптимизатору мешают другие индексы.
Без этого причину установить точно нельзя. Все советы будут или трепом или попаданием пальцем в небо
по i.nameтоже должен быть индекс
т.к. он принимает участие в сортировке
whereлучше переписать с использованием BETWEEN
он быстрей выполняется в данном случае