Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Хотелось бы поинтересоваться таким вопросом в приложении к 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 введены с целью оптимизации производительности запросов, но их целесообразность спорна... Может быть от них можно совсем отказаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 14:00 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
>>Из чего следует исходить, определяя порядок следования полей при создании индекса? Это решается на этапе проектирования. Я вообще не понимаю людей, которые сначала создают таблицы, а потом проектируют индексы. Ну а проектирование - это целое искусство. Зависит от того как вы будите агрегатные запросы писать (min,max,count) Не думаю что индекс (month,year,day) сильно поможет когла нужно будет сделать grouping set (year,month,day), но поможет в некоторых других случаях. Зависит от того, по каким ключам вы будите джойнить. Какие внешние ключи на таблице. короче все как в других базах. Правда каждый конкретный случай нужно рассматривать отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 15:14 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Внешних ключей нет, джоинов тоже. Просто выбор из таблицы 4-х целочисленных полей плюс count(*) по условию на других полях (rday, rmonth, етк, описано в предыдущем посте), простое группирование по тем самым выбраннам INT-ам. В другом запросе по сути тоже самое, только вместо count(*) sum(..) по одному из полей. Таблица проектировалась в первую очередь из того, какие данные она должна хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 16:23 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Поизучайте планы запросов. Если увидите, что какой-то индекс не используется или используется не в том месте где вы хотите - убейте его. И посмотрите на Design Adviser ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 16:28 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Не верю в ручную оптимизацию и не пытаюсь всё предусмотреть. Не царское это дело. Есть то, что в старых версиях DB2 называется Index Advisor, в новых - Design Advisor (db2advis.exe -?, либо интегрированный в Control Center), потому что научился предлагать не только индексы, но и MQT с MDC. Причём в случае db2advis параметром стоит дать файл с рабочим набором (SQL-выражениями, включая не только SELECT'ы, но и прочие (INSERT/UPDATE/DELETE)) с их частотами, чтобы он оценивал всё сразу. А встроенный в CC может это брать из кеша выражений (а ещё их может накапливать Query Patroller)! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 16:39 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
И неиспользуемые (в рабочем наборе) индексы теперь показывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 16:40 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Гонял уже db2advis на эту тему. Есть подозрение, что у него есть такая особенность... он вообоще говоря работает не со структурой таблицы+запросы, а с конкретными данными таблицы. Т.е. если у меня в таблице на момент тестирования будут некоторые данные, он мне даст советы по оптимизации запросов именно на этих данных. А когда приложение будет уже реально тестироваться, данные будут, скажем так, более разнородные, индекс созданный по совету db2advis не будет оптимальным. Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 17:30 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Описка, "приложение будет уже реально тестироваться"="приложение будет уже реально работать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 17:32 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
хех, не с данными , а со статистикой Обеспечьте ему рабочую статистику в тестовом окружении, и все. Да, порядок полей в индексе влияет и на локи тоже. На developerworks статья есть, где такой случай рассматривается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 17:39 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
ggv , спасибо за поправку, да так более похоже на правду. Попробую обеспечить статистику... Хотя все-таки хотелось бы разобраться каким образом эту оптимизацию следует производить вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 18:04 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
explain если вручную.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 18:15 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Подкорректировть запрос можно только с помощью SELECTIVITY тут есть описание как это делать. И Виктор тут еще вроде нащупал недокументированную возможность хинты писать. Где-то на форуме было- в поиск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 18:18 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
нету хинтов. То был оптический обман зрения. Случайно прорвалось по недосмотру ответсвенных товарисчей. Хотя, VM когда-то тоже была чисто унутренним тулзом IBM, а получилась успешная коммерческая ОС zVM... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 21:04 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
DangerXГонял уже db2advis на эту тему. Есть подозрение, что у него есть такая особенность... он вообоще говоря работает не со структурой таблицы+запросы, а с конкретными данными таблицы. Т.е. если у меня в таблице на момент тестирования будут некоторые данные, он мне даст советы по оптимизации запросов именно на этих данных. А когда приложение будет уже реально тестироваться, данные будут, скажем так, более разнородные, индекс созданный по совету db2advis не будет оптимальным. Или я ошибаюсь? Вообще, тестирование приложения, скажем, всего на тысяче записей, когда реально ожидается миллион, может привести к "неожиданным" проблемам позднее. Оптимизации, построение планов проводится на основе статистики. Но, по-моему, надо не статистику фальсифицировать, а постараться сгенерировать тестовые данные, причём по наихудшему сценарию (грубо говоря, ожидается один миллион - забейте в базу пять). Хоть вы можете получить план на сфальсифицированной статистике, но реальное время выполнения запроса вы из плана всё равно не узнаете, даже очень приблизительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2006, 22:09 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Маленькое замечание - почему VARCHAR (1) вместо CHAR (1) ? Зачем тратить место под дескриптор длины строки, когда длина может быть либо один символ, либо пусто? В остальном поддерживаю вышесказанное. Есть таблица, есть данные в ней, есть набор SQL операторов по работе с ней - вот тогда и задумывайтесь об оптимальных индексах или особенностях физической реализации таблицы (кластерные индексы и пр.) Не знаю, как на DB2 LUW, но на AS/400 DB2 adviser не "знает" про EVT (bitmap) индексы, кои могут оказаться очень практичными в некоторых ситуациях (н-р когда считается count(*)) Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 00:26 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
пардон, "фальсифицировать статистику" выражение не верное. Это документированный и рекомендуемый прием - использование статистики с рабочей базы на тестовой. И хотя о производительности всей Информационной Сиситемы это ничего не скажет, тем не менее, полезно, и планы запросов посмотреть можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 09:22 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Фальсификация - она и есть фальсификация, обман оптимизатора, невзирая на то, документированный это и рекомендуемый приём или нет. Но в данном контексте для меня термин "фальсификация" нейтральный, не несёт негативного оттенка. Насколько же полезно вам смотреть такой план? Я вот занимаюсь оптимизацией лишь тогда, когда это действительно нужно. Не зная реального времени выполнения, не знаю, нужна ли оптимизация. Кстати, если план X "на глаз" кажется лучше плана Y, не факт, что он действительно лучше. А если в запросе участвует хотя бы десяток таблиц, то тот "глаз" можно и сломать ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 10:18 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
это для компаний, у которых разработчики польностью отделены от эксплуатационщиков. Последние первым могут статистику дать. Так что право на жизнь имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 10:36 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa , тестирование производится на "сгенеренных" данных объемом... Ну сейчас вот около 30 млн. записей. По поводу их достоверности... Проблема вся в том, что сколько там в итоге будет никто толком не знает. Точнее, пока допустип, 5 млн в день, а потом может и на порядок больше. И возможны варианты вроде того что таблица будет бэкапироваться и очищаться, например, раз в месяц. В общем, решение ищется чтобы получить требуемую производительность. В принципе, данные не отличаются принципиально от тех что будут в итоге, лишь с той разницей что поля tm и rday, rmonth, etc. у них ограничены узким интервалом времен, а в реале диапазон будет зависеть от условий эксплуатации. Кстати, вот в том числе поэтому пока невозможно адекватно оценить итоговую селективность по этим полям... "Я вот занимаюсь оптимизацией лишь тогда, когда это действительно нужно"... В том то и дело, что проблема уже на этапе нагрузочного тестирования вылезла - запросы которые должны выполняться раз в час выполняются по 70 мин. Копнул поглубже вопрос, в итоге получается что оптимизировать можно под тестовые данные (в принципе это уже удалось), но как там будет в итоге - хоть правда на отдел эксплуатации этот головняк перекладывай :) Anton Demidov , "почему VARCHAR (1) вместо CHAR (1)" - так получилось. На самом деле схема БД генерится Torque , это сделано для унификации под разные БД, вот оно почему-то varchar(..)и сделало. Что, сильно может на производительность сыграть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 13:18 |
|
||
|
Порядок полей в индексе, вообще про индексы
|
|||
|---|---|---|---|
|
#18+
DangerX... Копнул поглубже вопрос, в итоге получается что оптимизировать можно под тестовые данные (в принципе это уже удалось), но как там будет в итоге - хоть правда на отдел эксплуатации этот головняк перекладывай :) Я бы тогда перенёс максимум запросов во VIEW, а не держал бы их внутри приложения. Тогда будет намного легче почти на лету подправить запрос в случае чего. DangerXНа самом деле схема БД генерится Torque , это сделано для унификации под разные БД, вот оно почему-то varchar(..)и сделало. Что, сильно может на производительность сыграть? Пару байт, да на ваши 30 млн записей будет 60 мег, которые надо будет считать, сортировать и пр.. Должно быть мелочи, по сравнению с основным размером базы. Плюс ещё какие-то накладные расходы на обработку этого дескриптора длины. Мелкие, но совершенно ненужные расходы. Но так, как схема БД генерится, то я бы не стал связываться, а то ещё на какие глюки из-за этого нарвётесь. Если только в самом Torque найдёте, где подправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2006, 21:52 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=33680203&tid=1605395]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 365ms |

| 0 / 0 |
