Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

плохой индекс в FireBird   Найти похожие ветки 

 
ford ©   (2010-07-02 10:16) [0]

Доброго времени суток!
есть таблица, в которой есть поле Status Char(1)
смысл этого поля это хранить состояние текущей записи, т.е. определнный символ в поле для каждой записи имеет смысл, типа
А - запись активна
Н - запись в архиве
W - запись обрабатывается
и т.д.
естественно основная масса записей в таблице имеет статус=Н
записей с остальным статусом не более 100 в день
в таблице записей не так и много около 50000.
построил по этому полю индекс
create index MainList_IDX1 on MainList (STATUS);

запрос:
select t.* from MainList t Where (t.status="W" or t.Status="F")
выдает 6 записей.
посмотрел через анализатор запросов, этот запрос, оказалось что происходит 164 чтения с использованием индекса

анализатор IBAnalist ругается на этот индекс говорит что слишком много одинаковых.

Подскажите, плииз, почему при использовании индекса по этому полю, происходит аж 164 чтения, когда записей этому запросу соответствующих всего 6. И почему этот индекс считается плохим? и какой тогда будет лучше?
например если сделать индекс по уникальному полю + статус, тогда все записи будут уникальны, но если я делаю условие в выборке по полую статус и ни как не использую в нем уникальное поле ключа, то  так думаю такой индекс вообще не будет использоваться ...


 
Sergey13 ©   (2010-07-02 11:31) [1]

Потому и плохой, что всего мало разных значений. Смысл читать сначала индекс, а потом по нему данные практически пропадает. Проще по данным пробежаться.

> например если сделать индекс по уникальному полю + статус,
> тогда все записи будут уникальны, но если я делаю условие
> в выборке по полую статус и ни как не использую в нем уникальное
> поле ключа, то  так думаю такой индекс вообще не будет использоваться

А вот если сделать статус+уникальное поле, то вполне верятно (хотя не факт) и смысл появится. Не на этом запросе, так на другом.
Вообще создание индексов это штука интересная. Одним индексом можно систему положить на лопатки и заставить летать.
Создание "настроечных" индексов лучше отложить на потом, когда система будет готова и можно будет анализировать основные запросы пользователей.


 
ford ©   (2010-07-02 11:38) [2]


> А вот если сделать статус+уникальное поле, то вполне верятно
> (хотя не факт) и смысл появится.

сделал такой индекс (STATUS,ID)
действительно анализатор показал что происходит всего 6 индексных чтений

но если сделать индекс (ID,STATUS) результат тот же  - 6 чтений

т.е порядок полей при создании индекса не влияет на его работу?


 
ford ©   (2010-07-02 11:42) [3]

но если сделать два индекса
(STAUS,ID) и (ID,STATUS)
то анализатор показывает что в запросе используется первый индекс


 
Sergey13 ©   (2010-07-02 11:47) [4]

> [2] ford ©   (02.07.10 11:38)

Попробуй запрос с
Where (t.status="W" or t.Status="F") and ID>10000
Where ID<500 and (t.status="W" or t.Status="F")
или нечто похожее для разных индексов.

Вроде как должны быть отличия. Хотя утверждать не буду. Оптимизаторы у всех разные.


 
ford ©   (2010-07-02 13:37) [5]


> Попробуй запрос с
> Where (t.status="W" or t.Status="F") and ID>10000
> Where ID<500 and (t.status="W" or t.Status="F")
> или нечто похожее для разных индексов.


попроболвал... тоже самое
для всех используется один индекс (STATUS,ID) собственно который определн был первым, если его деактивировать, то тогда используется (ID,STATUS)


 
Anatoly Podgoretsky ©   (2010-07-02 14:47) [6]

> ford  (02.07.2010 10:16:00)  [0]

Потому что "слишком много одинаковых"


 
Petr V. Abramov ©   (2010-07-02 23:58) [7]


> Sergey13 ©   (02.07.10 11:31) [1]

тут вот что интересно: начиная с 1.5, уникальный индекс позволяет null`ы. Как это реализовано, я не понел, да и не слишком морочился искать. Если как в оракуле, null`ы тупо не индексируются, решение можно подсказать, а если  хз как, то хз.


 
Ega23 ©   (2010-07-05 11:44) [8]


> тут вот что интересно: начиная с 1.5, уникальный индекс
> позволяет null`ы.


null-ы, или таки один null?


 
PEAKTOP ©   (2010-07-06 16:48) [9]


запрос:
select t.* from MainList t Where (t.status="W" or t.Status="F")


Здесь уже объяснили, что индекс тем эффективнее, чем больше различных записей.

в твоем случае запрос вида:

select t.*
from MainList t
Where (t.status||""="W")
    or (t.Status||""="F")

отключит использование неэффективного индекса.


 
Petr V. Abramov ©   (2010-07-06 16:49) [10]


> Ega23 ©   (05.07.10 11:44) [8]

много null`ов



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.067 c
15-1329894286
Loginov Dmitry
2012-02-22 11:04
2013.03.22
Новый адрес моего сайта


2-1329295758
toropoff
2012-02-15 12:49
2013.03.22
Antialiasing


2-1346166751
avil
2012-08-28 19:12
2013.03.22
tcombobox со своими правилами


15-1329149378
Pit
2012-02-13 20:09
2013.03.22
.NET dll


15-1330633805
Юрий
2012-03-02 00:30
2013.03.22
С днем рождения ! 2 марта 2012 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский