MS SQL 2000 - Помогите со структурой БД
От: Divineshadow  
Дата: 04.09.06 15:49
Оценка:
Здравствуйте.
Есть таблица FPeoples, которая содержит записи о людях и имеет следующие поля:
ID — уникальный идентификатор человека, тип integer, primary key
Second — фамилия, тип varchar(50)
First — имя, тип varchar(50)
Middle — отчество, тип varchar(50)
В таблице 4 миллиона записей.
Разумеется поиск в такой таблице осуществляется очень медлено.
Например поиск всех "ИВАНОВ%" идёт около 40 секунд. Всего Ивановых около 30000.
Я сделал следуюущю структуру:

таблица Seconds — содержит список всех фамилий, которые встречаются в базе.
всего два поля:
id int — уникальный идентификатор фамилии,
Value varchar(50) primary key — фамилия
Таблицы Firsts и Middles имеют аналагичную структуру.

таблица SecondRelay — связывает уникальный идентификатор человека и идентификатор фамилии:
id — уникальный идентификатор человека,
Sid — идентификатор фамилии index
Таблицы FirstRelay и MiddleRelay имеют аналагичную структуру.

Поиск всех "ИВАНОВ%" делается так:
select * from FPeoples where ID in (select id from SecondRleay where sid in (select id from Seconds where value like 'ИВАНОВ%'))

Поиск идёт 9 секунд. В принципе это приемлимо, но хотелось бы по быстрее
Основной затык просиходит здесь:
select * from FPeoples where ID in ...

так как:
select id from SecondRleay where sid in (select id from Seconds where value like 'ИВАНОВ%')

выполняется меньше чем за секунду.
Подскажите, как можно увеличить скорость поиска? (для меня это уже дело принципа )
Неужели выборка 30000 записей из FPeolpes по идентификатору может идти 9 секунд?...
Я пробывал заносить данные из тыблицы FPeolpes в оперативную память и делать выборку этих 30000 записей —
поиск происходит около 30-40 миллисекунд...
Разумеется поиск в таблице расположенной на жёстком диске, происходит гораздо медленее чем в оперативке,
но разница между 30мс и 9с всё-таки ощутимая.
Навреняка есть способ улучшить поиск.
Re: MS SQL 2000 - Помогите со структурой БД
От: Lloyd Россия  
Дата: 04.09.06 16:35
Оценка:
Здравствуйте, Divineshadow, Вы писали:

D>таблица SecondRelay — связывает уникальный идентификатор человека и идентификатор фамилии:

D>id — уникальный идентификатор человека,
D>Sid — идентификатор фамилии index
D>Таблицы FirstRelay и MiddleRelay имеют аналагичную структуру.

Позвольте полюбопытствовать, а табличка SecondRelay — на тот случай, если у человека несколько фамилий?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: MS SQL 2000 - Помогите со структурой БД
От: Igor Trofimov  
Дата: 04.09.06 17:05
Оценка:
D>Разумеется поиск в такой таблице осуществляется очень медлено.
D>Например поиск всех "ИВАНОВ%" идёт около 40 секунд. Всего Ивановых около 30000.

Индекс просто надо было сделать по этому полю.
LIKE "SomeText%" может использовать индекс.
Re[2]: MS SQL 2000 - Помогите со структурой БД
От: Аноним  
Дата: 05.09.06 01:36
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

D>>Разумеется поиск в такой таблице осуществляется очень медлено.

D>>Например поиск всех "ИВАНОВ%" идёт около 40 секунд. Всего Ивановых около 30000.

iT>Индекс просто надо было сделать по этому полю.

iT>LIKE "SomeText%" может использовать индекс.
Индекс используется.
Re[2]: MS SQL 2000 - Помогите со структурой БД
От: Аноним  
Дата: 05.09.06 01:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Позвольте полюбопытствовать, а табличка SecondRelay — на тот случай, если у человека несколько фамилий?

Смешно
Re[3]: MS SQL 2000 - Помогите со структурой БД
От: Lomman  
Дата: 05.09.06 06:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Igor Trofimov, Вы писали:


D>>>Разумеется поиск в такой таблице осуществляется очень медлено.

D>>>Например поиск всех "ИВАНОВ%" идёт около 40 секунд. Всего Ивановых около 30000.

iT>>Индекс просто надо было сделать по этому полю.

iT>>LIKE "SomeText%" может использовать индекс.
А>Индекс используется.

Попробуй IN заменить на EXISTS и еще IMHO избавься от SecondRleay.
Re[3]: MS SQL 2000 - Помогите со структурой БД
От: GavrishDV  
Дата: 05.09.06 06:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Igor Trofimov, Вы писали:


D>>>Разумеется поиск в такой таблице осуществляется очень медлено.

D>>>Например поиск всех "ИВАНОВ%" идёт около 40 секунд. Всего Ивановых около 30000.

iT>>Индекс просто надо было сделать по этому полю.

iT>>LIKE "SomeText%" может использовать индекс.
А>Индекс используется.

Надо копать глубже, что там у вас с памятью, таблички то не маленькие,
наверно идут дисковые операции нужно анализировать — включить расширенную статистику(в QA set statistic time, set Statistic IO). если там присутствуют физические IO то тут батенька оперативы маловато будет...
Да и выборка в 30000 записей тоже за 30 мс не пройдет никак, если есть SQL Server Management Studio (для SQL 2005) то там можно глянуть обемы информации.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[3]: MS SQL 2000 - Помогите со структурой БД
От: Igor Trofimov  
Дата: 05.09.06 06:43
Оценка:
iT>>Индекс просто надо было сделать по этому полю.
iT>>LIKE "SomeText%" может использовать индекс.
А>Индекс используется.

Сомневаюсь что-то. Та конструкция, которую вы наворотили, вынеся отдельные строковые поля в отдельные таблицы, должна работать скорее медленее, чем быстрее, с учетом всех IN, чтения данных из двух таблиц вместо одной и одинакового результата. А у вас — разница на порядок.

Ну и выборка 30 000 из 4 000 000 по индексу, мне кажется, не должна занимать 40с. Это как-то многовато.
Re: MS SQL 2000 - Помогите со структурой БД
От: Аноним  
Дата: 05.09.06 07:51
Оценка: -1
Здравствуйте, Divineshadow, Вы писали:

<Злостно поскипано>

курите JOIN, причем желательно засамокрутить в VIEW и его уже и индексировать.
Re: MS SQL 2000 - Помогите со структурой БД
От: Аноним  
Дата: 06.09.06 13:11
Оценка:
Здравствуйте, Divineshadow, Вы писали:

Сделай секционирование.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.