Главная страница
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.032 c
10-1095699307
AlexSV
2004-09-20 20:55
2005.07.11
как использовать idl из MSDN


4-1116082031
TForm1
2005-05-14 18:47
2005.07.11
Запуск внутри...


3-1116433390
Делфенок
2005-05-18 20:23
2005.07.11
Чтение информации из dbf


3-1117434692
silvestr
2005-05-30 10:31
2005.07.11
Как подключиться к удалёной базе MS SQL 2000 - MSDE


14-1118043518
Андрей Жук
2005-06-06 11:38
2005.07.11
Никто не подскажет, чему соответствует __leave в Borland C++?