powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / IBM DB2 Express-C - не используются индексы
9 сообщений из 9, страница 1 из 1
IBM DB2 Express-C - не используются индексы
    #36539461
AJetman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ранее работал только с MySQL. Обратил внимание на бесплатность IBM DB2 Express-C, впрочем и 3к в год за подписку не так и много.

Вопрос в следующем. Многие туториалы по MySQL рекомендовали создавать индексы сразу по нескольким полям для экономии места, так сказать :) В DB2 сделал также, но получил то, что DB2 не использует индексы при выборки по полям, которые идут после первого поля(т.е. здесь это: XXX_TRAINER), по которым создавался индекс.

Схема такая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE XXXXXXX (
XXX_ID BIGINT PRIMARY KEY NOT NULL GENERATED BY DEFAULT AS IDENTITY, 
XXX_NAME VARCHAR( 255 ) NOT NULL, 
XXX_NAME2 VARCHAR( 255 ) NOT NULL, 
XXX_TRAINER VARCHAR( 255 ) NOT NULL, 
XXX_DATE DATE NOT NULL, 
XXX_INT1 INTEGER NOT NULL, 
XXX_INT2 INTEGER NOT NULL, 
XXX_TIME1 DOUBLE NOT NULL, 
XXX_DATA1 VARCHAR( 64 ) NOT NULL, 
XXX_DATA2 VARCHAR( 8 ) NOT NULL, 
XXX_INT3 INTEGER NOT NULL, 
XXX_COMMENT VARCHAR( 255 ) NOT NULL, 
XXX_DATA3 VARCHAR( 255 ) NOT NULL, 
XXX_TIME2 DOUBLE NOT NULL, 
XXX_DATA4 VARCHAR( 32 ) NOT NULL, 
XXX_DATA5 VARCHAR( 32 ) NOT NULL, 
XXX_DATA6 VARCHAR( 16 ) NOT NULL, 
XXX_TIME3 DOUBLE NOT NULL);

CREATE INDEX XXXXXXX_IDX1 ON XXXXXXX (XXX_TRAINER, XXX_NAME, XXX_NAME2, XXX_DATA3);

Соответственно запросы:
Код: plaintext
SELECT * FROM XXXXXXX WHERE XXX_TRAINER = 'XXXX';
- индекс используется.

Код: plaintext
SELECT * FROM XXXXXXX WHERE XXX_NAME = 'XXXX';
- индекс НЕ используется.

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

Проверял используется ли индекс с помощью программы db2expln .

С чем это связано или просто я нуб и чего-то общеизвестного не знаю?

Спасибо.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36539496
AJetman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел добавить, что IBM DB2 Express-C версии 9.7, установленная на Ubuntu 9.10 x64.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540940
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AJetman
Соответственно запросы:
Код: plaintext
SELECT * FROM XXXXXXX WHERE XXX_TRAINER = 'XXXX';
- индекс используется.

Код: plaintext
SELECT * FROM XXXXXXX WHERE XXX_NAME = 'XXXX';
- индекс НЕ используется.

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

Проверял используется ли индекс с помощью программы db2expln .

С чем это связано или просто я нуб и чего-то общеизвестного не знаю?

Только не говорите, что в MySQL второй запрос будет использовать тот ваш индекс.

Собирайте статистику (скажем, runstats on СХЕМА.ТАБЛИЦА with distribution and detailed indexes all) и пользуйте Index Adviser (db2advis.exe под виндами). Скормите Index Adviser запрос, и он расскажет, какие индексы, по его мнению, нужно создать, чтобы этот запрос работал максимально быстро.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540947
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor Metelitsa
Только не говорите, что в MySQL второй запрос будет использовать тот ваш индекс.

Собирайте статистику (скажем, runstats on СХЕМА.ТАБЛИЦА with distribution and detailed indexes all) и пользуйте Index Adviser (db2advis.exe под виндами). Скормите Index Adviser запрос, и он расскажет, какие индексы, по его мнению, нужно создать, чтобы этот запрос работал максимально быстро.

Это я, вроде, нуб, но топикастер создаёт вложенный индекс.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540952
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой. Тогда я тоже нуб. Что такое "вложенный индекс"?
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540957
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaОй. Тогда я тоже нуб. Что такое "вложенный индекс"?
Поторопился я писать. Я имел ввиду, с

Код: plaintext
 '-INCLUDE------(----column-name-+--)-'  

А тут обычный индекс.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540980
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между
CREATE INDEX XXXXXXX_IDX1 ON XXXXXXX (XXX_TRAINER, XXX_NAME, XXX_NAME2, XXX_DATA3);
и
CREATE unique INDEX XXXXXXX_IDX2 ON XXXXXXX (XXX_TRAINER) include (XXX_NAME, XXX_NAME2, XXX_DATA3);
разница не особо велика (да, во втором случае поддерживается уникальность по первому списку, но если она (уникальность) в наличии, индексы будут содержать одни и те же данные).

Когда XXXXXXX_IDX1 полезен для XXX_NAME? Напрашивается сказать "никогда". Хочется найти контрпример (если таблица "широкая", а индекс "узкий", так, что размером много меньше таблицы, не будет ли сделать полное сканирование там?), но SELECT * убивает эту возможность.

Где полезен
CREATE INDEX XXXXXXX_IDX1 ON XXXXXXX (XXX_TRAINER, XXX_NAME, XXX_NAME2, XXX_DATA3);
в противовес
CREATE INDEX XXXXXXX_IDX_n1 ON XXXXXXX (XXX_TRAINER);
?

Наверное, в
SELECT * FROM XXXXXXX WHERE XXX_TRAINER = 'XXXX' and XXX_NAME = 'XXXX';

Но гарантий нет. Оптимизатор посчитает и решит. Например, если первый индекс слишком большой.. А, быть может, решит вообще не использовать индексы, если таблица мала.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36540987
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНаверное, в
SELECT * FROM XXXXXXX WHERE XXX_TRAINER = 'XXXX' and XXX_NAME = 'XXXX';

Я по сути это и подразумевал, что индекс будет использоваться только в запросе в связке с первой указанной колонкой при создании индекса. Т.е. вот как-нибудь так.
...
Рейтинг: 0 / 0
IBM DB2 Express-C - не используются индексы
    #36542155
AJetman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил. Действительно, в MySQL все также. Значит я нуб...

Спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / IBM DB2 Express-C - не используются индексы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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