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

Какие индексы вообще строить???

Добавлено: 22 сен 2005, 02:40
misha mike
Люди, помогите сумбур в голове побороть, плиииз!

Есть полумиллионная таблица в FBE 1.5.2 и примитивные запросы типа:
SELECT CNT FROM IBTable WHERE (ID = :pID) AND (SUBID = :pSUBID) AND (STR = :pSTR)
и
UPDATE IBTable SET CNT = :pNewCNT WHERE (ID = :pID) AND (SUBID = :pSUBID) AND (STR = :pSTR)

Так вот, самую высокую скорость я наблюдаю когда таблица имеет один единственный (он же первичный ключ) индекс по полю ID. Если добавить по индексу еще и для SUBID и STR, то скорость падает почти вдвое! Если создать составной индекс по полям ID;SUBID;STR, скорость падает не так значительно, но все равно падает.

Что это значит и какие индексы вообще нужны для ускорения вышеприведенных запросов?

Re: Какие индексы вообще строить???

Добавлено: 22 сен 2005, 03:13
VictorIn
misha mike писал(а):... когда таблица имеет один единственный (он же первичный ключ) индекс по полю ID.
Для такого случая, уже достаточно запроса
SELECT CNT FROM IBTable WHERE (ID = :pID) ,
возвращающего единственную запись.

Добавлено: 23 сен 2005, 01:19
misha mike
Мда.... Это я конечно недоглядел, спасибо.

Но остается еще один вопрос: в одном из местных ФАКов я прочитал что для ускорения запросов с выражением типа "... WHERE (CNT = :pCNT) AND (STR = :pSTR)" нужно создавать индексы по каждому из полей отдельно. Но как показала моя практика, составной индекс по всем упомянутым во WHERE полям в два раза эффективнее. Даже query plan показывает, что при наличии выбора между отдельными индексами и составным, FB всегда выбирает составной (отдельные включаются в план только при отсутствии составного).

Добавлено: 23 сен 2005, 09:19
dimitr
если у тебя всегда такие запросы, то нужен составной. Ты все правильно написал про производительность. Если может быть либо использовано одно условие, либо другое, то два отдельных индекса предпочтительнее. Дай ссылку на прочитанный ФАК, возможно его стоит подправить.

Добавлено: 23 сен 2005, 15:52
misha mike
dimitr писал(а):если у тебя всегда такие запросы, то нужен составной. Ты все правильно написал про производительность. Если может быть либо использовано одно условие, либо другое, то два отдельных индекса предпочтительнее.
Теперь понятно. Но отсюда следует еще один вопрос: есть ли хоть какой-нибудь способ создать составной индекс из двух INT и одного VARCHAR(>184)?
Дай ссылку на прочитанный ФАК, возможно его стоит подправить.
Я тут глянул, это оказывается не здесь я видел, а в ФАКе RU.DELPHI.DB (http://faqs.org.ru/progr/pascal/delphi_db2.htm, Q-31).

Добавлено: 24 сен 2005, 13:09
dimitr
misha mike писал(а):есть ли хоть какой-нибудь способ создать составной индекс из двух INT и одного VARCHAR(>184)?
нет.
misha mike писал(а):в ФАКе RU.DELPHI.DB (http://faqs.org.ru/progr/pascal/delphi_db2.htm, Q-31).
там про OR, а не про AND.