Здравствуйте.
Есть таблица 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с всё-таки ощутимая.
Навреняка есть способ улучшить поиск.
Здравствуйте, Divineshadow, Вы писали:
D>таблица SecondRelay — связывает уникальный идентификатор человека и идентификатор фамилии:
D>id — уникальный идентификатор человека,
D>Sid — идентификатор фамилии index
D>Таблицы FirstRelay и MiddleRelay имеют аналагичную структуру.
Позвольте полюбопытствовать, а табличка SecondRelay — на тот случай, если у человека несколько фамилий?

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Lloyd, Вы писали:
L>Позвольте полюбопытствовать, а табличка SecondRelay — на тот случай, если у человека несколько фамилий? 
Смешно
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, 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>>
iT>>Индекс просто надо было сделать по этому полю.
iT>>LIKE "SomeText%" может использовать индекс.
А>Индекс используется.
Сомневаюсь что-то. Та конструкция, которую вы наворотили, вынеся отдельные строковые поля в отдельные таблицы, должна работать скорее медленее, чем быстрее, с учетом всех IN, чтения данных из двух таблиц вместо одной и одинакового результата. А у вас — разница на порядок.
Ну и выборка 30 000 из 4 000 000 по индексу, мне кажется, не должна занимать 40с. Это как-то многовато.