Текущий архив: 2013.03.22;
Скачать: CL | DM;
Вниз
плохой индекс в FireBird Найти похожие ветки
← →
ford © (2010-07-02 10:16) [0]Доброго времени суток!<br/>есть таблица, в которой есть поле Status Char(1)<br/>смысл этого поля это хранить состояние текущей записи, т.е. определнный символ в поле для каждой записи имеет смысл, типа<br/>А - запись активна<br/>Н - запись в архиве<br/>W - запись обрабатывается <br/>и т.д.<br/>естественно основная масса записей в таблице имеет статус=Н <br/>записей с остальным статусом не более 100 в день<br/>в таблице записей не так и много около 50000.<br/>построил по этому полю индекс<br/>create index MainList_IDX1 on MainList (STATUS);<br/><br/>запрос:<br/>select t.* from MainList t Where (t.status="W" or t.Status="F")<br/>выдает 6 записей.<br/>посмотрел через анализатор запросов, этот запрос, оказалось что происходит 164 чтения с использованием индекса<br/><br/>анализатор IBAnalist ругается на этот индекс говорит что слишком много одинаковых.<br/><br/>Подскажите, плииз, почему при использовании индекса по этому полю, происходит аж 164 чтения, когда записей этому запросу соответствующих всего 6. И почему этот индекс считается плохим? и какой тогда будет лучше?<br/>например если сделать индекс по уникальному полю + статус, тогда все записи будут уникальны, но если я делаю условие в выборке по полую статус и ни как не использую в нем уникальное поле ключа, то  так думаю такой индекс вообще не будет использоваться ...
← →
Sergey13 © (2010-07-02 11:31) [1]Потому и плохой, что всего мало разных значений. Смысл читать сначала индекс, а потом по нему данные практически пропадает. Проще по данным пробежаться.<br/><br/>> например если сделать индекс по уникальному полю + статус,<br/>> тогда все записи будут уникальны, но если я делаю условие <br/>> в выборке по полую статус и ни как не использую в нем уникальное <br/>> поле ключа, то  так думаю такой индекс вообще не будет использоваться <br/><br/>А вот если сделать статус+уникальное поле, то вполне верятно (хотя не факт) и смысл появится. Не на этом запросе, так на другом.<br/>Вообще создание индексов это штука интересная. Одним индексом можно систему положить на лопатки и заставить летать.<br/>Создание "настроечных" индексов лучше отложить на потом, когда система будет готова и можно будет анализировать основные запросы пользователей.
← →
ford © (2010-07-02 11:38) [2]<i><br/>> А вот если сделать статус+уникальное поле, то вполне верятно <br/>> (хотя не факт) и смысл появится.<br/></i><br/>сделал такой индекс (STATUS,ID)<br/>действительно анализатор показал что происходит всего 6 индексных чтений<br/><br/>но если сделать индекс (ID,STATUS) результат тот же  - 6 чтений<br/><br/>т.е порядок полей при создании индекса не влияет на его работу?
← →
ford © (2010-07-02 11:42) [3]но если сделать два индекса <br/>(STAUS,ID) и (ID,STATUS) <br/>то анализатор показывает что в запросе используется первый индекс
← →
Sergey13 © (2010-07-02 11:47) [4]> [2] ford ©   (02.07.10 11:38)<br/><br/>Попробуй запрос с <br/>Where (t.status="W" or t.Status="F") and ID>10000<br/>Where ID<500 and (t.status="W" or t.Status="F")<br/>или нечто похожее для разных индексов.<br/><br/>Вроде как должны быть отличия. Хотя утверждать не буду. Оптимизаторы у всех разные.
← →
ford © (2010-07-02 13:37) [5]<i><br/>> Попробуй запрос с<br/>> Where (t.status="W" or t.Status="F") and ID>10000<br/>> Where ID<500 and (t.status="W" or t.Status="F")<br/>> или нечто похожее для разных индексов.<br/></i><br/><br/>попроболвал... тоже самое <br/>для всех используется один индекс (STATUS,ID) собственно который определн был первым, если его деактивировать, то тогда используется (ID,STATUS)
← →
Anatoly Podgoretsky © (2010-07-02 14:47) [6]<i>> ford  (02.07.2010 10:16:00)  [0]</i><br/><br/>Потому что "слишком много одинаковых"
← →
Petr V. Abramov © (2010-07-02 23:58) [7]<i><br/>> Sergey13 ©   (02.07.10 11:31) [1]<br/></i><br/>тут вот что интересно: начиная с 1.5, уникальный индекс позволяет null`ы. Как это реализовано, я не понел, да и не слишком морочился искать. Если как в оракуле, null`ы тупо не индексируются, решение можно подсказать, а если  хз как, то хз.
← →
Ega23 © (2010-07-05 11:44) [8]<i><br/>> тут вот что интересно: начиная с 1.5, уникальный индекс <br/>> позволяет null`ы. <br/></i><br/><br/>null-ы, или таки один null?
← →
PEAKTOP © (2010-07-06 16:48) [9]<i><br/>запрос:<br/>select t.* from MainList t Where (t.status="W" or t.Status="F")<br/></i><br/><br/>Здесь уже объяснили, что индекс тем эффективнее, чем больше различных записей.<br/><br/>в твоем случае запрос вида:<br/><code><br/>select t.* <br/>from MainList t <br/>Where (t.status||""="W")<br/>     or (t.Status||""="F")<br/></code><br/>отключит использование неэффективного индекса.
← →
Petr V. Abramov © (2010-07-06 16:49) [10]<i><br/>> Ega23 ©   (05.07.10 11:44) [8]<br/></i><br/>много null`ов
Страницы: 1 вся ветка
Текущий архив: 2013.03.22;
Скачать: CL | DM;
Память: 0.92 MB
Время: 0.06 c