Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > [Firebird] Оптимальное число индексов в таблице


Автор: Gluttton 10.5.2009, 23:08
Доброго времени суток!

СУБД - FireBird 2.1.
В БД (помимо всего прочего) есть три таблицы со сходной структурой:

Код

ID   VARCHAR(18) PK
...
X_S BIGINT
Y_S BIGINT
X_F BIGINT
Y_F BIGINT


Где Х, Y - координаты (на всякий случай).
Таблицы заполняються однажды! В процесе эксплуатации БД, в 99% запросов будет осуществлен поиск одного поля в которое входит определенная точка. Т.е. просмотр всех четырех значений координат.
Объемы таблиц:
1 ~600 записей smile
2 ~100К записей
3 ~6М записей

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

Автор: Akella 11.5.2009, 09:54
индексы нужно организовывать только по тем полям, по которым будет производится поиск или сортировка. Думаю, что если в таблице 600 записей, то индекс может и не понадобится.

Автор: Gluttton 11.5.2009, 22:44
Цитата

индексы нужно организовывать только по тем полям, по которым будет производится поиск или сортировка


Меня просто смущает, тот факт, что из шести столбцов для таблицы объемом ~6М:
1 индекс - т.к. первичный ключ;
2 индекс - т.к. внешний ключ;
3-6 индексы - т.к. по этим полям будет осуществляться поиск.

Итого на 6 столбцов - 6 индексов. Это нормально? Серверу не поплохеет smile ?

Автор: Deniz 12.5.2009, 06:24
Gluttton, если в поиске учавствуют всегда 2 поля (X и Y), то можно сделать один составной вместо 2.

Цитата(Gluttton @  11.5.2009,  02:08 Найти цитируемый пост)
Таблицы заполняются однажды!

Цитата(Gluttton @  11.5.2009,  02:08 Найти цитируемый пост)
я часто в И-нете натыкаюсь на высказывания о том, что чрезмерное использование индексов ухудшает быстродействие
ухудшение будет только в некоторых случаях:
1. Частая вставка/изменение данных - перестройка индекса + периодический сбор статистики для актуализации индекса.
2. Использование неэффективного индекса (например: пол работника). Чем ближе индекс к уникальному тем лучше.
Если у тебя первый пункт не предвидится, то и проблем не будет, почти.

Автор: Gluttton 12.5.2009, 07:29
Цитата

пол работника


Сказывается усталость - час не мог понять зачем в БД хранить данные о половине работника smile !

Цитата

Gluttton, если в поиске учавствуют всегда 2 поля (X и Y), то можно сделать один составной вместо 2.


А и не знал, что так можно, спасибо за идею - буду пробовать!

Цитата

1. Частая вставка/изменение данных - перестройка индекса + периодический сбор статистики для актуализации индекса.
2. Использование неэффективного индекса (например: пол работника). Чем ближе индекс к уникальному тем лучше.


1-го не предвидиться. 2-ое условие тоже в общем выполняется (но вот комбинации X_S, Y_S и X_F, Y_F вообще уникальны).

Автор: Deniz 12.5.2009, 07:38
Цитата(Gluttton @  12.5.2009,  10:29 Найти цитируемый пост)
А и не знал, что так можно, спасибо за идею - буду пробовать!
главное чтобы порядок полей в индексе и в where был одинаковый

Автор: Akella 12.5.2009, 09:11
Цитата(Deniz @  12.5.2009,  06:24 Найти цитируемый пост)
Gluttton, если в поиске учавствуют всегда 2 поля (X и Y), то можно сделать один составной вместо 2.

Будет иметь значение, что используется в условии where:  and или or. Возможно придётся делать один составной индекс, и два раздельных.

Добавлено через 1 минуту и 32 секунды
Цитата(Gluttton @  10.5.2009,  23:08 Найти цитируемый пост)
Таблицы заполняються однажды! 

После заполнения пересчитывай статистику индексов.

Автор: Gluttton 16.5.2009, 12:32
Поразмыслив над предложеным, взяв во внимание, что поиск в запросе осуществляется так:
Код

        WHERE SHEET.X_S<=:XF
        AND SHEET.X_F>:XS
        AND SHEET.Y_S<=:YF
        AND SHEET.Y_F>:YS

Создал вот такой индекс:
Код

CREATE INDEX SHEET_COORD ON SHEET(X_S, X_F, Y_S, Y_F);


Результат превзошел все мои ожидаения smile !

Akella и Deniz заслужено получают +1 за практический совет! Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)