Главная страница
    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.45 MB
Время: 0.037 c
3-1117522893
galexis
2005-05-31 11:01
2005.07.11
Ошибка "Разрушительный сбой"


4-1116172367
seregka
2005-05-15 19:52
2005.07.11
Добавление программы в popup меню Windows


1-1119514595
polariton2
2005-06-23 12:16
2005.07.11
Картинки в шапке StringGrid


5-1088080715
Tor
2004-06-24 16:38
2005.07.11
Панель с кнопками


4-1115969500
Валера
2005-05-13 11:31
2005.07.11
создание ярлыка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский