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

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

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

Ответить
misha mike
Сообщения: 3
Зарегистрирован: 22 сен 2005, 02:08

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

Сообщение misha mike » 22 сен 2005, 02:40

Люди, помогите сумбур в голове побороть, плиииз!

Есть полумиллионная таблица в 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, скорость падает не так значительно, но все равно падает.

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

VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

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

Сообщение VictorIn » 22 сен 2005, 03:13

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

misha mike
Сообщения: 3
Зарегистрирован: 22 сен 2005, 02:08

Сообщение misha mike » 23 сен 2005, 01:19

Мда.... Это я конечно недоглядел, спасибо.

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

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 23 сен 2005, 09:19

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

misha mike
Сообщения: 3
Зарегистрирован: 22 сен 2005, 02:08

Сообщение misha mike » 23 сен 2005, 15:52

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

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 24 сен 2005, 13:09

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

Ответить