Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-1110562111
Штотоносец
2005-03-11 20:28
2005.07.11
Алгоритм преобразования монохромного изображения


1-1118920806
olevacho
2005-06-16 15:20
2005.07.11
невидимое приложение


14-1118329934
Soft
2005-06-09 19:12
2005.07.11
Исполнитель желаний.


1-1118746336
Define
2005-06-14 14:52
2005.07.11
Можно ли программно сделать DragDrop объекта


5-1088944101
ArMellon
2004-07-04 16:28
2005.07.11
как например к стандартой кнопке прицепить tlabel снизу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский