DB2 Multiple Index для одинаковых комбинаций столбцов - PullRequest
1 голос
/ 28 октября 2009

Допустим, у меня есть таблица T с столбцами C1, C2 ... C10.

C1, C2 и C3 являются наиболее часто упоминаемыми столбцами в нескольких запросах. Порядок, в котором упоминаются эти столбцы, не может контролироваться.

Для повышения производительности запросов мне нужно создать несколько индексов, таких как (C1, C2, C3), (C1, C3, C2), (C2, C1, C3), (C2, C3, C1) и т. Д.?

На примере двух похожих запросов ...

выберите * от t1, t2 где t1.c1 = t2.c1 и t1.c2 = t2.c2 и t1.c3 = t3.c3 и

выберите * от t1, t2 где t1.c2 = t2.c2 и t1.c1 = t2.c1 и t1.c3 = t3.c3

Нужны ли мне два индекса (C1, C2, C3) и (C2, C1, C3) для повышения производительности вышеупомянутых двух разных запросов, или для обеих запросов достаточно одной комбинации?

Я полагаю, что это не требуется, и предположим, что DB2 будет достаточно умна, чтобы переставить столбцы в запросе, чтобы они соответствовали любой комбинации индексов, если используются все C1, C2 и C3.

Может ли кто-нибудь подтвердить и указать мне несколько статей, связанных с этим.

Используемая версия DB2 - 9,5 в AIX

Ответы [ 3 ]

1 голос
/ 28 октября 2009

В DB2 для Linux / UNIX / Windows порядок предикатов и критериев соединения в запросе не имеет значения с точки зрения оптимизатора. Часть переписывания запросов оптимизатора будет учитывать это.

В зависимости от запроса оптимизатор может выбрать индекс, независимо от того, включен он (C3, C2, C1) или (C1, C2, C3). Однако это не означает, что порядок столбцов в индексе не имеет значения - он имеет значение. Как правило, вы хотите поместить столбцы в порядке от наименьшего количества элементов к наименьшему количеству элементов, но, конечно, есть много исключений. Есть целые книги, написанные по правильному дизайну индекса (книга Лахденмаки / Лича очень хороша), поэтому я рекомендую вам взглянуть на них.

1 голос
/ 28 июня 2011

Я не очень уверен насчет DB2, но в oracle wat происходит, когда мы создаем индекс, скажем,

Создать INDEX I1 на T1 (c1);

тогда он создаст индекс по столбцу (c1) и также отсортирует его.

Incase составного индекса, как в вашем случае:

Создать INDEX I2 на T2 (c1, c2)

Он будет хранить данные в отсортированном формате. Так что, помня об этом, я думаю, что будет быстрее запросить первый столбец в приведенном выше индексе, как показано ниже:

выберите c1, c2 из T2

Пожалуйста, поправьте меня, если я ошибаюсь в любой части

1 голос
/ 28 октября 2009

Настройка базы данных - это не операция «забей и забудь», равно как и инвестирование в хедж-фонды Берни Мэдхоффа: -)

Yous должен предоставить умеренно разумное первое предположение (на основе ожидаемого поведения), а затем монитор при производстве запросов, которые выполняются.

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

Это только способ, которым вы можете быть уверены, что ваша база данных настроена правильно.

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

Например, допустим, у вас есть индекс (c1, c2). Запрос

select * from t where c2 = '2009-01-01';

будет не использовать этот индекс, поскольку все клавиши c2 разбросаны по всему индексу, а не в одной области.

Это может быть достаточным для оптимизации

select * from t where c2 = '2009-01-01' and c1 = 'x';

, так как он может просто посмотреть x2009-01-01 в индексе. Тем не менее,

select * from t where c2 <= '2009-01-01' and c2 <= '2009-01-05' and c1 = 'x';

страдает той же проблемой, что и первый запрос - клавиши c2 не являются смежными в индексе.

Вот почему вы должны измерить, а не угадать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...