我有一个巨大的企业数据库(大约500,000)与邮政编码,地址等。我需要按升序显示他们从100英里的用户邮政编码。我有一个邮政编码与相关的纬度和经度的表格。什么是更快/更好的解决方案?
案例1:计算距离并按距离排序。我会有用户当前的邮政编码,纬度和经度的会话。我将使用SQL Server函数计算距离。
案例二:获得50英里范围内的所有邮政编码,并获得所有这些邮政编码的企业。在这里,我将不得不在查找业务时编写一个select in嵌套查询。
我认为案例1将计算数据库中所有业务的距离。而第二种情况只会获取邮政编码,最终只会获取所需的业务。因此,第二种情况应该更好?如果有任何建议,我将不胜感激。
这是我在第一种情况下的LINQ查询。
var businessListQuery = (from b in _DB.Businesses
let distance = _DB.CalculateDistance(b.Zipcode,userLattitude,userLogntitude)
where b.BusinessCategories.Any(bc => bc.SubCategoryId == subCategoryId)
&& distance < 100
orderby distance
select new BusinessDetails(b, distance.ToString()));
int totalRecords = businessListQuery.Count();
var ret = businessListQuery.ToList().Skip(startRow).Take(pageSize).ToList();
顺便说一句,应用程序是用C#编写的。
谢谢
发布于 2011-12-15 20:52:08
除了查看GEOGRAPHY
数据类型之外,您还可以做更糟糕的事情,例如:
CREATE TABLE Places
(
SeqID INT IDENTITY(1,1),
Place NVARCHAR(20),
Location GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
CROSS JOIN Places p2
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO
geography::Point
获取纬度和经度以及SRID (特殊参考ID号)。在本例中,SRID是4326,这是标准的经纬度。因为已经有了纬度和经度,所以可以先用ALTER TABLE
添加地理列,然后用UPDATE
填充它。
我已经展示了两种从表中获取数据的方法,但是您不能用这种方法创建索引视图(索引视图不能有自联接)。但是,您可以创建一个实际上是缓存的辅助表,该表是根据上面的内容填充的。然后,您只需考虑维护它(可以通过触发器或其他一些过程来完成)。
注意,交叉连接将给您250,000,000行,但是搜索很简单,因为您只需要查看其中一个places列(即,SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
,第二个将给您更少的行,但是查询需要同时考虑Place1和Place2列)。
https://stackoverflow.com/questions/8526075
复制