高效的SQL Geography通配符名称搜索20 mill记录

时间:2011-08-19 04:35:28

标签: sql tsql sql-server-2008 clrstoredprocedure sqlgeography

我们拥有一个拥有2000万+ geoWe位置(且不断增长)的SQL 2008数据库,每个位置都包含标准名称/地址/地理位置/ ID / Etc列。

我们需要一种基于距离有效搜索记录的方法,还需要通过全文索引搜索“包含”关键字。我们的基本想法是根据最大距离搜索我们附近的位置。

现在,当我们在1英里内搜索星巴克等完整字符串时,搜索会在几秒钟后返回。但是,如果我们在1英里内搜索“星”,搜索有时需要几分钟才能返回。

我们一直在玩这样的逻辑:

DECLARE @geoSearchLocation GEOGRAPHY, @geoSearchPolygon GEOGRAPHY, @returncount smallint = 50
SET @geoSearchLocation = geography::Point(40.729047, -74.010086, 4326); --NYC
SET @geoSearchPolygon = geography::STGeomFromText('POLYGON((-74.015086 40.734047, 
                                         -74.015086 40.718047, 
                                         -74.005086 40.718047, 
                                         -74.005086 40.734047, 
                                         -74.015086 40.734047))', 4326);
SET @geoSearchLocation = geography::Point(40.729047, -73.010086, 4326);
SELECT TOP (100) --WITH TIES
*, gt.LocationGeog.STDistance(@geoSearchLocation) AS dist
FROM dbo.GeoLocation_Locations gt WITH (NOLOCK, INDEX(geolocation_HHHH128_sidx))
WHERE gt.LocationGeog.STIntersects(@geoSearchPolygon) = 1
ORDER BY gt.LocationGeog.STDistance(@geoSearchLocation)

然而,这会在搜索中引入欺骗和其他问题。我们也一直在尝试使用我们在网上找到的POWER论坛。

我们还有其他查询效果很好,这些查询仅基于距离或某个类别ID,这些查询在不到一秒的时间内返回。最大的问题是通配符字符串匹配。

有没有人有一个很棒的SQL或CLR proc接受名称(通配符支持)和处理2000万条记录时的距离?

现在我们陷入困境:(

提前谢谢, 杰夫

1 个答案:

答案 0 :(得分:0)

如果您正在搜索LIKE并且该列有索引,则简单'star%'谓词只会几乎。然而,随着数据集变大,性能将继续降低。如果你可以设置Sql Server的全文机制你会更好,它并不难,而且它比索引LIKE更快