Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Ручное планирование запросов   Найти похожие ветки 

 
Дмитрий_Б   (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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.051 c
3-1117687243
john_mag
2005-06-02 08:40
2005.07.11
обработчик MouseToCall


4-1116310493
Zhenja
2005-05-17 10:14
2005.07.11
Меняем частоту обновления экрана


8-1110900767
Adolf
2005-03-15 18:32
2005.07.11
написать текст на Image1


14-1117931066
FVlad
2005-06-05 04:24
2005.07.11
Delphi или Basic


1-1119428362
Lord Zmiy
2005-06-22 12:19
2005.07.11
Большие буквы