Страница 1 из 1

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

Добавлено: 23 дек 2005, 13:12
bill_2000
Есть запрос

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 и по всем полям для связи таблиц есть.

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

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

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

Добавлено: 25 дек 2005, 16:35
bill_2000
План запроса

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.

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

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

Добавлено: 26 дек 2005, 02:41
Oleg Loa
g.pgruppa, d.department, o.doljnost, f.firma

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

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

re

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

Добавлено: 26 дек 2005, 13:15
kdv
сколько записей сортируется, и сколько времени это занимает?

Re: re

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

Re:

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

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

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

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