Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Порядок полей в индексе, вообще про индексы / 20 сообщений из 20, страница 1 из 1
20.04.2006, 14:00
    #33679287
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Здравствуйте.

Хотелось бы поинтересоваться таким вопросом в приложении к DB2.

Из чего следует исходить, определяя порядок следования полей при создании индекса?

Вот, в частности, нашел такую статью: http://www.sql.ru/faq/faq_topic.aspx?fid=285

ASCRUS Чем нужно руководствоваться при создании составных индексов:
1. Первыми ставить поля, обладающие лучшей выборочностью индекса.
2. Первыми ставить поля, для которых будет меньшая разветвленность.
3. Стремиться к минимальному числу уровней индекса, стараться избегать использования в составных индексах большого кол-ва полей и длинных полей. Главная задача индекса - это ограничить круг выбираемых записей до приемлемого по скорости уровня выборки, а не обхвата значений всех полей, использующихся в выборке.
4. Помнить о правилах булевых операций для оптимизатора и первыми в индексе ставить поля, на которых в операциях выборок идет сравнение на равенство (=) и вхождение в список значений (IN). Поля, фильтрующиеся по интервалам периодов значений (>, <, >=, <=, BETWEEN) нужно ставить в конец списка полей индекса. Если на несколько полей используются такие операции, то в индексе необходимо указать только одно из них, так как оптимизатор ASA не будет использовать далее идущие в индексе поля. Для выбора наиболее оптимального такого поля следует так же руководствоваться пунктами 1, 2 и 3.

Насколько эти рекомендации общи? Насколько это применительно к DB2? В обсуждении статьи, в частности, были оспорены п.1 и п.2 в применении к Oracle...

Конечно, я понимаю что многое ещё зависит от конкретных условий, как то: структурf таблицы, объемы данных и запросы которые на этой таблице исполняются.

Опишу ситуацию... Таблица примерно с 20-ю полями, в основном INTEGER-ы, несколько VARCHAR(..) и TIMESTAMP. Причем год, месяц, день и час дублируются в отдельных полях

ryear INTEGER,
rmonth INTEGER,
rday INTEGER,
rhour INTEGER

также есть поля

event_type VARCHAR (1) - может принимать только 2 значения, по этому полю все записи разделяются на две группы в соотношении примерно 1/4 или 1/5.
protocol_command_id INTEGER - принимает значения от 1 до 10

Первая группа запросов на таблице, в общем виде, это выбор по заданным ryear, rmonth, rday, rhour, event_type, protocol_command_id. Остальные поля либо суммируются, либо игнорируются, либо по ним происходит группирование.

Вторая группа запросов это запросы по интервалу заданному на поле

tm TIMESTAMP

и строго заднных

event_type VARCHAR (1),
operator_id INTEGER ,
provider_id INTEGER,
service_id INTEGER

Объемы... Ограничения сверху нет, но миллионы и сотни миллионов записей вполне возможны. В первую очередь необходимо чтобы созданные индексы сильно не тормозили добавление в таблицу (нужно обеспечить скорость порядка нескольких тысяч запросов в секунду, по крайей мере не ухудшить уже достигнутые 8000). Во вторую очередь нужно чтобы вышеописанные запросы выполнялись... Ну, не более чем несколько минут, несколько десятков минут. И при этом не тормозили добавление.

Такие вопросы у меня возникают. В описанных условиях нужно использовать два отдельных индекса на каждую группу запросов, или можно обойтись одним? Ну и, самое главное, в каком порядке лучше располагать поля в индексе?

Да, и ещё, поля ryear, rmonth, rday, rhour введены с целью оптимизации производительности запросов, но их целесообразность спорна... Может быть от них можно совсем отказаться?
...
Рейтинг: 0 / 0
20.04.2006, 15:14
    #33679587
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
>>Из чего следует исходить, определяя порядок следования полей при создании индекса?

Это решается на этапе проектирования. Я вообще не понимаю людей, которые сначала создают таблицы, а потом проектируют индексы.
Ну а проектирование - это целое искусство.

Зависит от того как вы будите агрегатные запросы писать (min,max,count)
Не думаю что индекс (month,year,day) сильно поможет когла нужно будет сделать grouping set (year,month,day), но поможет в некоторых других случаях.

Зависит от того, по каким ключам вы будите джойнить.
Какие внешние ключи на таблице.
короче все как в других базах. Правда каждый конкретный случай нужно рассматривать отдельно.
...
Рейтинг: 0 / 0
20.04.2006, 16:23
    #33679879
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Внешних ключей нет, джоинов тоже.

Просто выбор из таблицы 4-х целочисленных полей плюс count(*) по условию на других полях (rday, rmonth, етк, описано в предыдущем посте), простое группирование по тем самым выбраннам INT-ам.

В другом запросе по сути тоже самое, только вместо count(*) sum(..) по одному из полей.

Таблица проектировалась в первую очередь из того, какие данные она должна хранить.
...
Рейтинг: 0 / 0
20.04.2006, 16:28
    #33679895
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Поизучайте планы запросов. Если увидите, что какой-то индекс не используется или используется не в том месте где вы хотите - убейте его. И посмотрите на Design Adviser
...
Рейтинг: 0 / 0
20.04.2006, 16:39
    #33679947
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Не верю в ручную оптимизацию и не пытаюсь всё предусмотреть. Не царское это дело. Есть то, что в старых версиях DB2 называется Index Advisor, в новых - Design Advisor (db2advis.exe -?, либо интегрированный в Control Center), потому что научился предлагать не только индексы, но и MQT с MDC. Причём в случае db2advis параметром стоит дать файл с рабочим набором (SQL-выражениями, включая не только SELECT'ы, но и прочие (INSERT/UPDATE/DELETE)) с их частотами, чтобы он оценивал всё сразу. А встроенный в CC может это брать из кеша выражений (а ещё их может накапливать Query Patroller)!
...
Рейтинг: 0 / 0
20.04.2006, 16:40
    #33679951
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
И неиспользуемые (в рабочем наборе) индексы теперь показывает.
...
Рейтинг: 0 / 0
20.04.2006, 17:30
    #33680158
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Гонял уже db2advis на эту тему.
Есть подозрение, что у него есть такая особенность... он вообоще говоря работает не со структурой таблицы+запросы, а с конкретными данными таблицы. Т.е. если у меня в таблице на момент тестирования будут некоторые данные, он мне даст советы по оптимизации запросов именно на этих данных. А когда приложение будет уже реально тестироваться, данные будут, скажем так, более разнородные, индекс созданный по совету db2advis не будет оптимальным. Или я ошибаюсь?
...
Рейтинг: 0 / 0
20.04.2006, 17:32
    #33680168
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Описка, "приложение будет уже реально тестироваться"="приложение будет уже реально работать"
...
Рейтинг: 0 / 0
20.04.2006, 17:39
    #33680203
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
хех, не с данными , а со статистикой
Обеспечьте ему рабочую статистику в тестовом окружении, и все.
Да, порядок полей в индексе влияет и на локи тоже.
На developerworks статья есть, где такой случай рассматривается.
...
Рейтинг: 0 / 0
20.04.2006, 18:04
    #33680321
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
ggv , спасибо за поправку, да так более похоже на правду. Попробую обеспечить статистику... Хотя все-таки хотелось бы разобраться каким образом эту оптимизацию следует производить вручную.
...
Рейтинг: 0 / 0
20.04.2006, 18:15
    #33680356
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
explain если вручную....
...
Рейтинг: 0 / 0
20.04.2006, 18:18
    #33680372
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Подкорректировть запрос можно только с помощью SELECTIVITY тут есть описание как это делать. И Виктор тут еще вроде нащупал недокументированную возможность хинты писать. Где-то на форуме было- в поиск.
...
Рейтинг: 0 / 0
20.04.2006, 21:04
    #33680668
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
нету хинтов. То был оптический обман зрения.
Случайно прорвалось по недосмотру ответсвенных товарисчей.
Хотя, VM когда-то тоже была чисто унутренним тулзом IBM, а получилась успешная коммерческая ОС zVM...
...
Рейтинг: 0 / 0
20.04.2006, 22:09
    #33680766
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
DangerXГонял уже db2advis на эту тему.
Есть подозрение, что у него есть такая особенность... он вообоще говоря работает не со структурой таблицы+запросы, а с конкретными данными таблицы. Т.е. если у меня в таблице на момент тестирования будут некоторые данные, он мне даст советы по оптимизации запросов именно на этих данных. А когда приложение будет уже реально тестироваться, данные будут, скажем так, более разнородные, индекс созданный по совету db2advis не будет оптимальным. Или я ошибаюсь?

Вообще, тестирование приложения, скажем, всего на тысяче записей, когда реально ожидается миллион, может привести к "неожиданным" проблемам позднее. Оптимизации, построение планов проводится на основе статистики. Но, по-моему, надо не статистику фальсифицировать, а постараться сгенерировать тестовые данные, причём по наихудшему сценарию (грубо говоря, ожидается один миллион - забейте в базу пять). Хоть вы можете получить план на сфальсифицированной статистике, но реальное время выполнения запроса вы из плана всё равно не узнаете, даже очень приблизительно.
...
Рейтинг: 0 / 0
21.04.2006, 00:26
    #33680931
Anton Demidov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Маленькое замечание - почему VARCHAR (1) вместо CHAR (1) ?
Зачем тратить место под дескриптор длины строки, когда длина может быть либо один символ, либо пусто?

В остальном поддерживаю вышесказанное. Есть таблица, есть данные в ней, есть набор SQL операторов по работе с ней - вот тогда и задумывайтесь об оптимальных индексах или особенностях физической реализации таблицы (кластерные индексы и пр.)

Не знаю, как на DB2 LUW, но на AS/400 DB2 adviser не "знает" про EVT (bitmap) индексы, кои могут оказаться очень практичными в некоторых ситуациях (н-р когда считается count(*))
Код: plaintext
1.
2.
--
Антон
Per rectum ad astrum
...
Рейтинг: 0 / 0
21.04.2006, 09:22
    #33681202
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
пардон, "фальсифицировать статистику" выражение не верное.
Это документированный и рекомендуемый прием - использование статистики с рабочей базы на тестовой. И хотя о производительности всей Информационной Сиситемы это ничего не скажет, тем не менее, полезно, и планы запросов посмотреть можно.
...
Рейтинг: 0 / 0
21.04.2006, 10:18
    #33681377
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Фальсификация - она и есть фальсификация, обман оптимизатора, невзирая на то, документированный это и рекомендуемый приём или нет. Но в данном контексте для меня термин "фальсификация" нейтральный, не несёт негативного оттенка.

Насколько же полезно вам смотреть такой план? Я вот занимаюсь оптимизацией лишь тогда, когда это действительно нужно. Не зная реального времени выполнения, не знаю, нужна ли оптимизация. Кстати, если план X "на глаз" кажется лучше плана Y, не факт, что он действительно лучше. А если в запросе участвует хотя бы десяток таблиц, то тот "глаз" можно и сломать ;-)
...
Рейтинг: 0 / 0
21.04.2006, 10:36
    #33681472
ggv
ggv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
это для компаний, у которых разработчики польностью отделены от эксплуатационщиков.
Последние первым могут статистику дать.
Так что право на жизнь имеет.
...
Рейтинг: 0 / 0
21.04.2006, 13:18
    #33682372
DangerX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
Victor Metelitsa , тестирование производится на "сгенеренных" данных объемом... Ну сейчас вот около 30 млн. записей. По поводу их достоверности...
Проблема вся в том, что сколько там в итоге будет никто толком не знает. Точнее, пока допустип, 5 млн в день, а потом может и на порядок больше. И возможны варианты вроде того что таблица будет бэкапироваться и очищаться, например, раз в месяц. В общем, решение ищется чтобы получить требуемую производительность.
В принципе, данные не отличаются принципиально от тех что будут в итоге, лишь с той разницей что поля tm и rday, rmonth, etc. у них ограничены узким интервалом времен, а в реале диапазон будет зависеть от условий эксплуатации.

Кстати, вот в том числе поэтому пока невозможно адекватно оценить итоговую селективность по этим полям...

"Я вот занимаюсь оптимизацией лишь тогда, когда это действительно нужно"... В том то и дело, что проблема уже на этапе нагрузочного тестирования вылезла - запросы которые должны выполняться раз в час выполняются по 70 мин. Копнул поглубже вопрос, в итоге получается что оптимизировать можно под тестовые данные (в принципе это уже удалось), но как там будет в итоге - хоть правда на отдел эксплуатации этот головняк перекладывай :)

Anton Demidov , "почему VARCHAR (1) вместо CHAR (1)" - так получилось. На самом деле схема БД генерится Torque , это сделано для унификации под разные БД, вот оно почему-то varchar(..)и сделало. Что, сильно может на производительность сыграть?
...
Рейтинг: 0 / 0
21.04.2006, 21:52
    #33683902
Anton Demidov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок полей в индексе, вообще про индексы
DangerX...
Копнул поглубже вопрос, в итоге получается что оптимизировать можно под тестовые данные (в принципе это уже удалось), но как там будет в итоге - хоть правда на отдел эксплуатации этот головняк перекладывай :) Я бы тогда перенёс максимум запросов во VIEW, а не держал бы их внутри приложения. Тогда будет намного легче почти на лету подправить запрос в случае чего.

DangerXНа самом деле схема БД генерится Torque , это сделано для унификации под разные БД, вот оно почему-то varchar(..)и сделало. Что, сильно может на производительность сыграть? Пару байт, да на ваши 30 млн записей будет 60 мег, которые надо будет считать, сортировать и пр.. Должно быть мелочи, по сравнению с основным размером базы. Плюс ещё какие-то накладные расходы на обработку этого дескриптора длины. Мелкие, но совершенно ненужные расходы.
Но так, как схема БД генерится, то я бы не стал связываться, а то ещё на какие глюки из-за этого нарвётесь. Если только в самом Torque найдёте, где подправить.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Порядок полей в индексе, вообще про индексы / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]