Главная страница
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.029 c
14-1118144204
Xmen
2005-06-07 15:36
2005.07.11
Программа в СистемТрей


14-1118828391
Sash
2005-06-15 13:39
2005.07.11
не грузится комп :(


14-1118649725
Андрей Жук
2005-06-13 12:02
2005.07.11
Попробуйте сделать такой фокус


3-1116933870
alex_***
2005-05-24 15:24
2005.07.11
MS SQL server


1-1118785641
rosl
2005-06-15 01:47
2005.07.11
нумерация