Люди, помогите сумбур в голове побороть, плиииз!
Есть полумиллионная таблица в 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, скорость падает не так значительно, но все равно падает.
Что это значит и какие индексы вообще нужны для ускорения вышеприведенных запросов?
Какие индексы вообще строить???
-
- Сообщения: 3
- Зарегистрирован: 22 сен 2005, 02:08
Re: Какие индексы вообще строить???
Для такого случая, уже достаточно запросаmisha mike писал(а):... когда таблица имеет один единственный (он же первичный ключ) индекс по полю ID.
SELECT CNT FROM IBTable WHERE (ID = :pID) ,
возвращающего единственную запись.
-
- Сообщения: 3
- Зарегистрирован: 22 сен 2005, 02:08
Мда.... Это я конечно недоглядел, спасибо.
Но остается еще один вопрос: в одном из местных ФАКов я прочитал что для ускорения запросов с выражением типа "... WHERE (CNT = :pCNT) AND (STR = :pSTR)" нужно создавать индексы по каждому из полей отдельно. Но как показала моя практика, составной индекс по всем упомянутым во WHERE полям в два раза эффективнее. Даже query plan показывает, что при наличии выбора между отдельными индексами и составным, FB всегда выбирает составной (отдельные включаются в план только при отсутствии составного).
Но остается еще один вопрос: в одном из местных ФАКов я прочитал что для ускорения запросов с выражением типа "... WHERE (CNT = :pCNT) AND (STR = :pSTR)" нужно создавать индексы по каждому из полей отдельно. Но как показала моя практика, составной индекс по всем упомянутым во WHERE полям в два раза эффективнее. Даже query plan показывает, что при наличии выбора между отдельными индексами и составным, FB всегда выбирает составной (отдельные включаются в план только при отсутствии составного).
-
- Сообщения: 3
- Зарегистрирован: 22 сен 2005, 02:08
Теперь понятно. Но отсюда следует еще один вопрос: есть ли хоть какой-нибудь способ создать составной индекс из двух INT и одного VARCHAR(>184)?dimitr писал(а):если у тебя всегда такие запросы, то нужен составной. Ты все правильно написал про производительность. Если может быть либо использовано одно условие, либо другое, то два отдельных индекса предпочтительнее.
Я тут глянул, это оказывается не здесь я видел, а в ФАКе RU.DELPHI.DB (http://faqs.org.ru/progr/pascal/delphi_db2.htm, Q-31).Дай ссылку на прочитанный ФАК, возможно его стоит подправить.
нет.misha mike писал(а):есть ли хоть какой-нибудь способ создать составной индекс из двух INT и одного VARCHAR(>184)?
там про OR, а не про AND.misha mike писал(а):в ФАКе RU.DELPHI.DB (http://faqs.org.ru/progr/pascal/delphi_db2.htm, Q-31).