|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
Tesla13Яковлев ПавелЕсть предложение не изучать предмет теоретическиЕсть предложение не давать "предложений" если это не ответ по теме, предлагая то, что сразу сказано сделать невозможно (именно на этот случай сказано). Да и вообще смысл влезать не свою область? Шофер не должен быть механиком, но способен определить/поднять проблему если вместо второй скорости включается задняя. И сказать механику... если тот в этом "не видит проблемы, и - 'до тебя машинка ездила, и никто не жаловался'", то сменить механика. Получение данных из sysdistrib (а я предлагал только получение, а с их анализом тут бы могли помочь) позволило бы понять сколько записей в таблице для какого кода и на основании это доходчивее объяснить вам почему оптимизатор так себя ведёт. Так же вы путаете от непонимания sysmaster (отдельная системная база данных про которую вы писали что у вас нет доступа) и sysdistrib - таблицу существующую в каждой базе (и ваша не исключение) и помогающую планировать запрос. Tesla13Выбегаллону если у вас 40M записей с кодом 7, и по 10 записей where a=5, 6, 127, то естественно, что разница будет принципиальная. Во втором случае Информикс вообще откажется использовать индекс, будет сплошным перебором ковырять. Нда, и это прямо под ответом на сообщение от Журавлева Дениса... Начинаю понимать, что был глуп... это надо же, спрашивать в таком месте, где обитают такие... умные люди. Самокритика, да ещё так точно описывающая ситуацию, всегда приветствуется в этом форме. СУБД Informix такова не умным людям с ней тяжело. А тот, кто истерит вместо сотрудничества с людьми которые тратят своё личное время в попытке помочь, действительно рядом с ними будет ощущать себя глупым. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 22:40 |
|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
АнатоЛойTesla, давайте поступим проще, дабы не отклоняться от темы. 1) Вопрос: могли ли регулярно или нерегулярно тормозить запросы с "WHERE ext = ... и id = ..." при наличии только индексов (ext) и (id)? Ответ: могли. Основной вариант: выбор оптимизатором Informix неэффективного плана запроса (индексов). [ Запасной вариант: неравномерное распределение ext И id. Если у вас на таблицу в 40 миллионов записей 39 миллионов содержат ext=0 и другие 39 миллионов содержат id = -1, то индексы на ext и id вам мало помогут при запросе select * where ext = 0 and id = -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 03:04 |
|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
ВыбегаллоЗапасной вариант: неравномерное распределение ext И id. Если у вас на таблицу в 40 миллионов записей 39 миллионов содержат ext=0 и другие 39 миллионов содержат id = -1, то индексы на ext и id вам мало помогут при запросе select * where ext = 0 and id = -1 В первом посте ТС давал описание природы данных: ext - "почти уникален", id - всего 1 500 уникальных значений. Поэтому этот вариант я не рассматривал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 10:41 |
|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
АнатоЛойВ первом посте ТС давал описание природы данных: ext - "почти уникален", id - всего 1 500 уникальных значений. Поэтому этот вариант я не рассматривал. Кстати, ещё вопрос при таком распределении, какой индекс эффективнее (ext, id) или (id, ext). Но разница уж точно не должна быть ощутимее, чем на десяток процентов... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 10:43 |
|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
Журавлев ДенисВ зависимости от того что вы хотите, все строки или первые 100, эффективные планы будут разные.Я вроде нигде ни разу даже не намекал на "все строки", их в этой таблице (размер указывал) просто нереально вытащить, даже с супер оптимальным планом. Всегда было про первые 100/последние 100 при указании DESC, с моей стороны по крайней мере. Но да ладно. "Поднял" ветку по другому поводу, сообщить, что дело наконец сдвинулось с мертвой точки. т.к. глюки пошли и у других, в более очевидной форме. Так "поймали" ситуацию когда выбирается по условию (время, юзер, и т.д.) значение ключа для последующего изменения записи (настроено так, что изменять можно только по ключу в where), а последующий апдейт с id=xxx говорит - запись не найдена, т.е. в выборке с другим условием значение ключа есть, а операции с этим значением не работают...), подозреваю, что все те -1 в ключе, что "задваивали" на деле были другими значениями... и где то с ними "разрыв шаблона", типа в индексе -1, в базе реальное значение, или наоборот... Принято решение на праздниках (минимум активности предположительно) остановить базу(/предприятие) на 3 дня на "технические работы", пере индексацию и т.д. (не знаю, что они там вкладывают за смысл в фразу "технические работы", я с ними, как и тут похоже, на разных языках общаюсь). ... Тут надо бы написать "надеюсь на лучшее", типа исправят, и сделаю как надо, но мне уже по фигу, т.к. пока шла "война" нашел другую работу, после праздников буду увольняться ... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 11:46 |
|
Имеет ли смысл составной индекс ...
|
|||
---|---|---|---|
#18+
Tesla13В таблице есть 2 индекса (вообще то больше, но там все ясно) create index ext_id on trans (ext, id) и create index id on trans (id) В их необходимости сомнений нет, в смысле поиски идут по обоим, сомнение в "довеске" id в первом. Т.е. насколько этот "довесок" используется информиксом? Не проще ли обойтись простыми create index ext on trans (ext) и create index id on trans (id) Запросы используют насколько могу судить все варианты в примерно одинаковой мере... т.е. "WHERE ext = ... AND id = ..." (примерно в 30% случаев) и "WHERE ext = ..." (примерно в 30% случаев) и "WHERE id = ..." (примерно в 30% случаев, хотя тут чаще не "чистое условие", а в паре с временем например, "чистое" по количеству возвращенного не пройдет) Причем: поле ext строка "с претензией на уникальность" т.е. там и гуиды в строках, и свои от времени например рассчитанные значения... но все таки не уникальные (а каких то значений может быть много). поле id имеет всего примерно 1500 (int-овых) значений, что на 50-ти миллионную таблицу не так уж много для индекса. Ну, вот, в MSSQL я бы сделал 2 простых... он прекрасно работает и при "спаривании" в условии разных индексов. А в информиксе? Мне говорят "это для быстродействия" (тех самых первых 30% запросов), и типа когда он был не составным, а обычным (как считаю правильнее), все "очень тормозило"... НО!!! Меня не покидают смутные сомнения, что проблема в чем то другом. Очень уж похоже на - p.s. "Ноги" некоторым образом "растут" отсюда , если кому интересно. но тут без возможности даже проверить. Всю тему не читал, но хочу вставить свои пять копеек на тему, почему индекс create index ext_id on trans (ext, id) может быть лучше / быстрее, чем create index ext on trans (ext) . Как уже отметили, в поле ext может быть много дубликатов. Для индекса это будет означать, что на уровне листьев будет запись типа [ключ,rowid1,rowid2 ... rowidn]. При удалении или вставке, хождение по такому списку и его модификация будут более ресурсоемкими, чем если в ситуации [ключ,rowid]. Т.к. во втором случае соотв. ключ просто будет помечен, как удаленный и будет исключен из структуры индекса позже в процессе работы btree cleaner, а в первом будет foreground write. Замена индекса на составной, с дополнительным полем сделает набор ключей в индексе более дисперсным, а следовательно количество/длину упомянутых выше списков rowid'ов меньше/короче. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2013, 04:40 |
|
|
start [/forum/topic.php?fid=44&gotonew=1&tid=1607081]: |
0ms |
get settings: |
23ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
62ms |
get topic data: |
11ms |
get first new msg: |
157ms |
get forum data: |
3ms |
get page messages: |
234ms |
get tp. blocked users: |
3ms |
others: | 312ms |
total: | 831ms |
0 / 0 |