|
|
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Народ, подскажите пожалуйста теоретический вопрос по оптимальному построению индексов в Informix Есть три поля flag char(1) name_file char(12) dt_registr (datetime year to second) Во время работы программ производится отбор данных по различным условиям в разное время. Например 1. name_file = "tt010101.txt" 2. flag = "0" and name_file[1,2] = "rr" 3. flag = "0" and dt_registr < current and name_file[1,2] = "dd" При том что поле flag определяет статус обработки строки и зачастую является первичным для поиска нужных строк, а поиск по name_file ведется (как показано во втором и в третьем условии) по части поля. В связи с этим возник спор - как оптимально построить индексы для Informixa. Либо создать три отдельных индекса на каждое из полей 1.flag 2.name_file 3.dt_registr или создать три индекса, как по условию where 1.name_file 2.flag,name_file 3.flag,dt_registr,name_file или достаточно двух индексов 1.name_file 2.flag,name_file,dt_registr или 1.name_file 2.flag,dt_registr,name_file ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 13:13 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
flag,name_file,dt_registr - этот индекс будет наиболее оптимальным и использоваться в большинстве случаев (поиск по "flag", "flag,name_file", и "flag,name_file,dt_registr". Но, если у тебя все же будут запросы только с name_file или только dt_registr или name_file,dt_registr , то этот индекс использоваться не будет. Поэтому первый вариант с тремя отдельными индексами по одному ключу будет наиболее универсальным. Оптимальность - вещь очень условная, нужно как минимум, определиться с критериями. Ведь при интенсивной вставке модификация трех индексов будет более ресурсоемкой, чем модификация одного составного. Зато три индекса более универсальны. Если количество уникальных значений ключей будет мало, а общее кол-во строк будет большим, то отдельные индексы будут также менее производительны, чем один составной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 13:52 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Спасибо за разъяснения. С прочими запросами вопрос не ставится. Речь идет только про те три запроса, которые я описал. Они составляют ~90% всех ежедневных запросов. Про интенсивную вставку строк я сразу не подумал. Действительно надо брать в расчет и этот показатель. Просто меня смущает немного тот факт, что поиск по полю name_file производится по первым 2 символам. Будет ли в этом случае индекс flag,name_file,dt_registr работать эффективно, если выборка будет вестись по всем трем полям flag,name_file,dt_registr. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 14:38 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
В общем я разобрался сам. Открыл и почитал талмуд. Сделал несколько экспериментов. Просмотрел set explain. И в принципе получил ответы на интересующие меня вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 15:47 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
AlevtinВ общем я разобрался сам. Открыл и почитал талмуд. Сделал несколько экспериментов. Просмотрел set explain. И в принципе получил ответы на интересующие меня вопросы. Очень здорово. Таким людям и помогать приятно, не надо разжевывать, а только указать направление поиска и обдумывания. Тем не менее, для тех, кто только читает (а таких 90%) мог бы вкратце и описать свои выводы и заключения. Ведь далеко не у каждого есть время читать талмуды и ставить эксперименты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 18:34 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Хорошо. Попробую изложить свои рассуждения вслух. Я конечно не разбирался во всех деталях досконально, а только выяснил вопросы интересующие меня. Исходя из моей ситуации - есть таблица в которую каждые 30 секунд накачиваются строки данных для последующей обработки. Первоначально полю flag присваивается значение "0". Соответсвенно это те строки которые подлежат обработке. После завершения обработки по результатам flag апдейтится в одно из значений ("1","2","9"). Соотвественно и поиск в обязательном порядке у меня должен вестись вначале по полю flag. Далее среди строк со значением 0 каждый из процессов выхватыват свои, производя поиск по первым 2 символам поля name_file. Ну и плюс ко всему иногда дополнительно в запросе участвует поле dt_registr и плюс поиск ведется целиком только по полю name_file. Исходя из всего вышеизложенного я рассудил (и частично тесты подтвердили мои рассуждения) что три отдельных индекса на каждое из полей будет не самым эффективным хотя бы потому, что они будут отчасти излишними. Поэтому остановился на варианте 2 индексов 1) flag,name_file,dt_registr 2) name_file В принципе я и сразу хотел так поступить. Но меня смущал тот факт, что поиск по имени файла производится не целиком, а только по первым 2 символам. Когда идет поиск по первым двум полям, то старшая часть индекса отрабатывает как положенно - это я знал и раньше (даже если поиск по name_file ведется и не целиком по полю). При поиске же по всем трем полям (как показал set explain) вначале отрабатывает старшая часть индекса, состоящая из flag,name_file после чего из выбранных значений производится поиск по третей части индекса. Что меня полностью устраивает. А порассуждав еще немного - было принято решение исключить dt_registr вообще из индекса ;-)) Так как его ефективность достаточно низка. Отобрав из таблицы записи по flag и name_file получается выборка состоящая менее чем из 100 строк (за очень редким исключением). Соответсвенно и строить индекс на оставшиеся строки практически не имеет смысла. Да и запрос с поиском по всем трем полям относительно редок. Вот все мои рассуждения. Если я в чем то не прав. То на полноценное знание всех основ работы с базами данных я не претендую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2005, 10:38 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Alevtin Исходя из моей ситуации - есть таблица в которую каждые 30 секунд накачиваются строки данных для последующей обработки. Первоначально полю flag присваивается значение "0". Соответсвенно это те строки которые подлежат обработке. После завершения обработки по результатам flag апдейтится в одно из значений ("1","2","9"). Классическая идея состоит в том, что необработанные события хранятся в отдельной таблице, а архив обработанных сообщений - в другой. И индексы на них ставятся разные. И статистика по-разному пересобирается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2005, 13:56 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Если длина поля name_file большая, то индекс оптимальнее индекс построить только по первым 2-м символам поля name_file (если фильтровать таблицу всегда планируется именно по ним). По крайней мере на эксперименте можно глянуть: есть ли в этом практический смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2005, 14:11 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Ilya Kulagin Классическая идея состоит в том, что необработанные события хранятся в отдельной таблице, а архив обработанных сообщений - в другой. Вы бредите? В какой нормальной форме предлагается делить таблицу на две из-за значения аттрибута? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2005, 20:45 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
ТупойТолстяк Вы бредите? В какой нормальной форме предлагается делить таблицу на две из-за значения аттрибута? Способ сделать две разные сущности (событие и ответ на него) записями одной таблицы, отличающимися атрибутом, тоже мысль спорная, и решение здесь в каждом случае может быть другим, на что я и обратил внимание некоторое время тому назад. Но в данном случае дело даже не в этом. Классическим способом увеличения производительности является денормализация схемы данных. Что, если не ошибаюсь, открытым текстом написано в книжке Performance Tuning от того же Информикса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 09:52 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Ilya Kulagin Способ сделать две разные сущности (событие и ответ на него) записями одной таблицы, отличающимися атрибутом, тоже мысль спорная, и решение Откуда про две сущности? Не было такого. Наоборот: Alevtin 1. name_file = "tt010101.txt" Ilya Kulagin Но в данном случае дело даже не в этом. Классическим способом увеличения производительности является денормализация схемы данных. Что, если не ошибаюсь, открытым текстом написано в книжке Performance Tuning от того же Информикса...Это не классический способ - это ПОСЛЕДНИЙ когда другие способы включая калмание с бубном не помогли. В данном случае не вижу препятствий для оптимизатора со статистикой. Читайте внимательней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 21:19 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=33250778&tid=1608919]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 350ms |

| 0 / 0 |
