Как используются индексы при выполнении связанного запроса?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
bill_2000
Сообщения: 7
Зарегистрирован: 22 дек 2005, 18:43

Как используются индексы при выполнении связанного запроса?

Сообщение bill_2000 » 23 дек 2005, 13:12

Есть запрос

select p.pers_id, p.fio, p.dcreate, p.tcreate,
g.pgruppa, d.department, o.doljnost, f.firma

from departments d, groups g, firms f, occupations o, personnel p

where (p.department_id = d.department_id) and
(p.pgruppa_id = g.pgruppa_id) and
(p.firma_id = f.firma_id) and
(p.doljnost_id = o.doljnost_id)

order by dcreate

Он выполняется достаточно заметное время (порядка 5 секунд).
Без части order by запрос выполняется мгновенно.

Если делать выборку только по главной таблице

select PERS_ID, FIO,dcreate,tcreate

from personnel p

order by dcreate

запрос выполняется мгновенно.

Индекс по полю dcreate и по всем полям для связи таблиц есть.

Кто нибудь может сказать, почему использование связанного запроса
не дает воспользоваться индексом, и как с этим можно бороться?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 23 дек 2005, 13:29

план запроса приведи, а кроме того, если у тебя возникает сортировка, то можно подкрутить параметры сервера, если ты, конечно, не IB 6 используешь...

bill_2000
Сообщения: 7
Зарегистрирован: 22 дек 2005, 18:43

План запроса такой...

Сообщение bill_2000 » 25 дек 2005, 16:35

План запроса

Plan
PLAN SORT (JOIN (D NATURAL,P INDEX (DEPARTMENT_ID),O INDEX (OCCUPATIONS_ID),F INDEX (FIRMS_FIRMA_ID),G INDEX (GROUPS_PGRUPPA_ID)))

Adapted Plan
PLAN SORT (JOIN (D NATURAL,P INDEX (DEPARTMENT_ID),O INDEX (OCCUPATIONS_ID),F INDEX (FIRMS_FIRMA_ID),G INDEX (GROUPS_PGRUPPA_ID)))

Использую FB-1.0.2.

А что можно подкрутить и где?

Oleg Loa
Сообщения: 11
Зарегистрирован: 31 окт 2004, 18:24

Re: План запроса такой...

Сообщение Oleg Loa » 26 дек 2005, 02:41

g.pgruppa, d.department, o.doljnost, f.firma

эти поля случаем не varchar/char размером так по 1000 символов?

И сколько запрос выполняется без сортировки?

bill_2000
Сообщения: 7
Зарегистрирован: 22 дек 2005, 18:43

re

Сообщение bill_2000 » 26 дек 2005, 13:08

Случаем да, не то чтобы по 1000, но по 100, по 200 символов. Но запрос с этими полями, но без сортировки выполняется моментально (порядка 15 милисекунд).
Раньше все было в одной таблице, и проблем не было. Но решили сделать правильно и результат оказался плачевен...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 дек 2005, 13:15

сколько записей сортируется, и сколько времени это занимает?

Oleg Loa
Сообщения: 11
Зарегистрирован: 31 окт 2004, 18:24

Re: re

Сообщение Oleg Loa » 26 дек 2005, 13:28

bill_2000 писал(а):Случаем да, не то чтобы по 1000, но по 100, по 200 символов. Но запрос с этими полями, но без сортировки выполняется моментально (порядка 15 милисекунд).
Берём число записей в запросе и смотрим какой массив данных нужно отсортировать, особо учитыая суммарный размер записи в результирующем запросе - делаем ВЫВОДЫ.

bill_2000
Сообщения: 7
Зарегистрирован: 22 дек 2005, 18:43

Re:

Сообщение bill_2000 » 26 дек 2005, 15:46

Oleg Loa писал(а): Берём число записей в запросе и смотрим какой массив данных нужно отсортировать, особо учитыая суммарный размер записи в результирующем запросе - делаем ВЫВОДЫ.
Запрос с той же сортировкой только по главной таблице - происходит моментально, хотя количество записей то же. Когда поля department, firma и пр. находились в главной таблице, сортировка происходила моментально, хотя суммарный размер записи был примерно такой же.
Поэтому ВЫВОД мне пока не понятен.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 дек 2005, 16:49

проблема в том, что сервер решил проехаться натуралом по departments, а индекс order by есть только для персон. Соответственно, сортировка идет через память-диск, непонятно только, почему тебя напрягает пауза в 5 секунд.

bill_2000
Сообщения: 7
Зарегистрирован: 22 дек 2005, 18:43

Чем дело кончилось

Сообщение bill_2000 » 05 янв 2006, 19:15

Что забавно, все исправилось, когда я убрал индексы в главной таблице по идентификаторам словарных полей. Тут же исчез натурал, и выборка стала осуществляться за 15 милисекунд. Как бы это еще понять...

Ответить