如何索引街道地址列

时间:2011-08-30 19:20:03

标签: sql sql-server sql-server-2005

我有一个带有街道地址栏的位置表。我的应用程序提供了一个搜索机制,使用此列查询位置,我正在尝试加快查询速度。数据库有200多万条记录,我只是想我会提出这个问题来看看人们做了什么。我敢肯定我不是第一个。我的问题基本上是这样的:给定一个主键,地址,城市,州,邮政列,如何对该表进行索引,以便下面的查询不需要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 个答案:

答案 0 :(得分:3)

包含以LIKE开头的%谓词的查询无法通过索引提供帮助 - 它必须执行完整的表/聚簇索引扫描。

通常,诸如此类问题的解决方案是全文索引。请查看this documentation了解相关信息。

但是,我已经实现了自定义标记化,然后在过去成功使用常规索引 - 用于地址数据。将地址拆分为单词/标记,并将每个唯一标记存储在Token表中。然后有一个Address表,其中包含每个地址的唯一标识符以及您想要的任何其他元数据。最后,一个AddressToken表,其中每个前面的表都有一个外键,每个地址中的每个令牌都有一行。您可能希望对此方法进行非规范化(可能通过索引通道)以获得更好的性能。

答案 1 :(得分:3)

如果可能的话,最好的办法就是将地址分解为其组成部分。这就是美国邮局存储地址以及许多(大多数?)大型地址处理公司和代理商的方式。数据库设计最佳实践通常包括没有列保存一行的多个数据。现在您正在存储街道号码,街道方向(例如“北大街”的N),街道名称,街道类型等。

如果您需要将所有内容都正确分类,则可以为各个列编制索引。

我确信那里有一个标准(快速搜索ansi.org网站并没有给我任何东西)。存储地址是一件很常见的事情。

此外,如果您不想完全依靠自己的努力,可以找到许多地址清理服务和软件,以便将地址分解为这些列。