Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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=&quot;W&quot; or t.Status=&quot;F&quot;)<br/>выдает 6 записей.<br/>посмотрел через анализатор запросов, этот запрос, оказалось что происходит 164 чтения с использованием индекса<br/><br/>анализатор IBAnalist ругается на этот индекс говорит что слишком много одинаковых.<br/><br/>Подскажите, плииз, почему при использовании индекса по этому полю, происходит аж 164 чтения, когда записей этому запросу соответствующих всего 6. И почему этот индекс считается плохим? и какой тогда будет лучше?<br/>например если сделать индекс по уникальному полю + статус, тогда все записи будут уникальны, но если я делаю условие в выборке по полую статус и ни как не использую в нем уникальное поле ключа, то &#xA0;так думаю такой индекс вообще не будет использоваться ...


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

Потому и плохой, что всего мало разных значений. Смысл читать сначала индекс, а потом по нему данные практически пропадает. Проще по данным пробежаться.<br/><br/>&gt; например если сделать индекс по уникальному полю + статус,<br/>&gt; тогда все записи будут уникальны, но если я делаю условие <br/>&gt; в выборке по полую статус и ни как не использую в нем уникальное <br/>&gt; поле ключа, то &#xA0;так думаю такой индекс вообще не будет использоваться <br/><br/>А вот если сделать статус+уникальное поле, то вполне верятно (хотя не факт) и смысл появится. Не на этом запросе, так на другом.<br/>Вообще создание индексов это штука интересная. Одним индексом можно систему положить на лопатки и заставить летать.<br/>Создание &quot;настроечных&quot; индексов лучше отложить на потом, когда система будет готова и можно будет анализировать основные запросы пользователей.


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

<i><br/>&gt; А вот если сделать статус+уникальное поле, то вполне верятно <br/>&gt; (хотя не факт) и смысл появится.<br/></i><br/>сделал такой индекс (STATUS,ID)<br/>действительно анализатор показал что происходит всего 6 индексных чтений<br/><br/>но если сделать индекс (ID,STATUS) результат тот же &#xA0;- 6 чтений<br/><br/>т.е порядок полей при создании индекса не влияет на его работу?


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

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


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

&gt; [2] ford © &#xA0; (02.07.10 11:38)<br/><br/>Попробуй запрос с <br/>Where (t.status=&quot;W&quot; or t.Status=&quot;F&quot;) and ID&gt;10000<br/>Where ID&lt;500 and (t.status=&quot;W&quot; or t.Status=&quot;F&quot;)<br/>или нечто похожее для разных индексов.<br/><br/>Вроде как должны быть отличия. Хотя утверждать не буду. Оптимизаторы у всех разные.


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

<i><br/>&gt; Попробуй запрос с<br/>&gt; Where (t.status=&quot;W&quot; or t.Status=&quot;F&quot;) and ID&gt;10000<br/>&gt; Where ID&lt;500 and (t.status=&quot;W&quot; or t.Status=&quot;F&quot;)<br/>&gt; или нечто похожее для разных индексов.<br/></i><br/><br/>попроболвал... тоже самое <br/>для всех используется один индекс (STATUS,ID) собственно который определн был первым, если его деактивировать, то тогда используется (ID,STATUS)


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

<i>&gt; ford &#xA0;(02.07.2010 10:16:00) &#xA0;[0]</i><br/><br/>Потому что &quot;слишком много одинаковых&quot;


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

<i><br/>&gt; Sergey13 © &#xA0; (02.07.10 11:31) [1]<br/></i><br/>тут вот что интересно: начиная с 1.5, уникальный индекс позволяет null`ы. Как это реализовано, я не понел, да и не слишком морочился искать. Если как в оракуле, null`ы тупо не индексируются, решение можно подсказать, а если &#xA0;хз как, то хз.


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

<i><br/>&gt; тут вот что интересно: начиная с 1.5, уникальный индекс <br/>&gt; позволяет 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=&quot;W&quot; or t.Status=&quot;F&quot;)<br/></i><br/><br/>Здесь уже объяснили, что индекс тем эффективнее, чем больше различных записей.<br/><br/>в твоем случае запрос вида:<br/><code><br/>select t.* <br/>from MainList t <br/>Where (t.status||&quot;&quot;=&quot;W&quot;)<br/> &#xA0; &#xA0; or (t.Status||&quot;&quot;=&quot;F&quot;)<br/></code><br/>отключит использование неэффективного индекса.


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

<i><br/>&gt; Ega23 © &#xA0; (05.07.10 11:44) [8]<br/></i><br/>много null`ов



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.92 MB
Время: 0.06 c
15-1337113805
Юрий
2012-05-16 00:30
2013.03.22
С днем рождения ! 16 мая 2012 среда


4-1259572252
keymaster
2009-11-30 12:10
2013.03.22
Работа с POS-принтером.


15-1345045733
xayam
2012-08-15 19:48
2013.03.22
Расчет площади участка


2-1339237885
Savek
2012-06-09 14:31
2013.03.22
Не удаётся сохранить картинку


2-1337971927
Den
2012-05-25 22:52
2013.03.22
Передать VK_LBUTTON в функцию?