Что лучше: индекс по столбцу или создание справочника?

sp
Дата: 02.02.2009 04:21:58
Есть большая база данных ФИО - около 50 млн
очень уж тяжелая - поэтому подумываю создать справочники Фамилий, Имен и Отчеств и связать их с основной таблицей

Встает вопрос: что практичней и лучше (меньше по объему, быстрее по доступу, удобней для доступа)?

Спасибо за мнения
miksoft
Дата: 02.02.2009 10:14:36
Зависит от того, что вы делаете с этой табличкой.
Имхо, если для задачи достаточно индекса, то лучше остановиться на индексе.
sp
Дата: 02.02.2009 10:49:16
miksoft
Зависит от того, что вы делаете с этой табличкой.
Имхо, если для задачи достаточно индекса, то лучше остановиться на индексе.


я так понимаю индекс по полям раздует сильно базу?
miksoft
Дата: 02.02.2009 10:52:59
sp
miksoft
Зависит от того, что вы делаете с этой табличкой.
Имхо, если для задачи достаточно индекса, то лучше остановиться на индексе.
я так понимаю индекс по полям раздует сильно базу?
что для вас "сильно"? у вас база хранится на дисках прошлого века? Или вам регулярно нужно ее по диал-апу передавать?
Bely
Дата: 02.02.2009 11:13:00
sp
я так понимаю индекс по полям раздует сильно базу?
А вы думаете, что поиск в справочнике имени текстом, получение ID имени и потом поиск этого ID в большой таблице (без индекса) будет быстрым?
Наврядли... Так что индекс вам полюбому строить, скорее всего.

Но опять же - смотря какие запросы будут гоняться.

PS: если справочники имен и отчеств будут довольно компактными, то справочник фамилий будет большим. Надо еще и это учитывать.
ASCRUS
Дата: 02.02.2009 11:47:58
Я бы сделал в таблице на поля Имя и Отчество просто индексы, а вот на поле Фамилия вычисляемое поле c_ФИО COMPUTE(Left(ФИО, 3)) и на него уже индекс. Тогда вне зависимости от кол-ва фамилий в таблице, вот такой вот запрос всегда бы летал:
SELECT *
FROM Таблица
WHERE c_ФИО = Left(@ПоисковоеЗначение, 3) AND ФИО = @ПоисковоеЗначение

P.S. Все конечно будет зависеть от того, поддерживает ли СУБД вычисляемые поля и индексы на них. В принципе, если не поддерживает, никто не мешает сделать обычное NULL поле и аналогично вычислять его своей логикой - в триггере, ХП или же на клиенте.
sp
Дата: 02.02.2009 11:48:25
Bely
sp
я так понимаю индекс по полям раздует сильно базу?
А вы думаете, что поиск в справочнике имени текстом, получение ID имени и потом поиск этого ID в большой таблице (без индекса) будет быстрым?
Наврядли... Так что индекс вам полюбому строить, скорее всего.

Но опять же - смотря какие запросы будут гоняться.

PS: если справочники имен и отчеств будут довольно компактными, то справочник фамилий будет большим. Надо еще и это учитывать.


Ну индекс по числовому столбцу компактнее чем по столбцу фамилий в основной таблице?

Дело в том что я проиндексировал сейчас столбец фамилий и наблюдаю следующую какртину - в соединении при первом запросе по фамилии база долго тарахтит около минуты и затем выдает результат, последующие запросы проходят быстро - насколько я понимаю сервер подготовился типерь к запросу такого типа
Стоит поработать с другими таблицами и опять сделать запрос к таблице по фамилии опять при первом запросе тормоза - вот это меня сильно смущает
sp
Дата: 02.02.2009 11:54:49
ASCRUS
Я бы сделал в таблице на поля Имя и Отчество просто индексы, а вот на поле Фамилия вычисляемое поле c_ФИО COMPUTE(Left(ФИО, 3)) и на него уже индекс. Тогда вне зависимости от кол-ва фамилий в таблице, вот такой вот запрос всегда бы летал:
SELECT *
FROM Таблица
WHERE c_ФИО = Left(@ПоисковоеЗначение, 3) AND ФИО = @ПоисковоеЗначение

P.S. Все конечно будет зависеть от того, поддерживает ли СУБД вычисляемые поля и индексы на них. В принципе, если не поддерживает, никто не мешает сделать обычное NULL поле и аналогично вычислять его своей логикой - в триггере, ХП или же на клиенте.


Интересная идея!
А почему индекс только на 3 символа?
Можно мысль поразвернутей?

Спасибо
miksoft
Дата: 02.02.2009 11:58:57
sp
Дело в том что я проиндексировал сейчас столбец фамилий и наблюдаю следующую какртину - в соединении при первом запросе по фамилии база долго тарахтит около минуты и затем выдает результат, последующие запросы проходят быстро - насколько я понимаю сервер подготовился типерь к запросу такого типа
Стоит поработать с другими таблицами и опять сделать запрос к таблице по фамилии опять при первом запросе тормоза - вот это меня сильно смущает
Что для вас "запрос по фамилии"?
grey_rat
Дата: 02.02.2009 12:59:05
sp
ASCRUS
Я бы сделал в таблице на поля Имя и Отчество просто индексы, а вот на поле Фамилия вычисляемое поле c_ФИО COMPUTE(Left(ФИО, 3)) и на него уже индекс.


Интересная идея!
А почему индекс только на 3 символа?
Можно мысль поразвернутей?
Спасибо


Это выработанный практикой компромисс между скоростью и объемом индекса.
Есть вариант - индекс по первым трем буквам фамилии и инициалам. Скорость почти не уступает полностью проиндексированным ФИО, а размер - детский.