Как индексировать столбец адреса улицы - PullRequest
4 голосов
/ 30 августа 2011

У меня есть таблица местоположений со столбцом адреса улицы.Мое приложение предоставляет механизм поиска, который запрашивает местоположения с этим столбцом, и я пытаюсь ускорить запросы.У БД чуть более 2 миллионов записей, и я просто решил поставить этот вопрос, чтобы посмотреть, что сделали люди.Я уверен, что я не первый.Мой вопрос в основном таков: с учетом первичного ключа, адреса, города, штата, столбцов zip, как должна индексироваться эта таблица, чтобы запросы, подобные следующим, не занимали 10 секунд:

`select * from location where loc_address_s like '%blvd%'`
`select * from location where loc_address_s like 'oak' AND loc_city like 'salem'`

и т...

Ответы [ 2 ]

4 голосов
/ 30 августа 2011

Лучше всего, если это вообще возможно, разбить адрес на составляющие. Это то, как почтовое отделение США хранит адреса, а также многие (большинство?) Крупные компании и агентства, занимающиеся обработкой адресов. Лучшие практики проектирования баз данных обычно включают отсутствие столбца, содержащего более одного фрагмента данных для строки. Прямо сейчас вы сохраняете номер улицы, направление улицы (например, N для "North Main Street"), название улицы, тип улицы и т. Д.

Как только вы все разложите правильно, вы можете индексировать отдельные столбцы, если вам нужно это сделать.

Я уверен, что есть стандарт (быстрый поиск по сайту ansi.org мне ничего не дал). Хранение адресов - довольно распространенная вещь.

Кроме того, вы можете найти множество служб и программ по очистке адресов, которые разбивают адреса на эти столбцы, если вы не хотите делать это самостоятельно.

3 голосов
/ 30 августа 2011

Запрос, который включает в себя предикат LIKE, начинающийся с %, не может быть обработан индексом - ему придется выполнить полное сканирование таблицы / кластерного индекса.

Как правило, решение таких проблемтак как это полнотекстовая индексация.Взгляните на эту документацию для получения информации.

Однако в прошлом я реализовал пользовательский токенизацию и затем успешно использовал обычные индексы - для адресных данных.Разделите адреса на слова / токены и сохраните каждый уникальный токен в таблице Token.Затем имейте таблицу Address, которая содержит уникальный идентификатор для каждого адреса и любые другие метаданные, которые вы хотите.И, наконец, таблица AddressToken, которая имеет внешний ключ для каждой из предыдущих таблиц и строку для каждого токена в каждом адресе.Возможно, вы захотите денормализовать этот подход (возможно, с помощью индексации через), чтобы получить еще лучшую производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...