社区首页 >问答首页 >利用大型SQL Server数据库进行距离计算

利用大型SQL Server数据库进行距离计算
EN

Stack Overflow用户
提问于 2011-12-15 20:20:51
回答 1查看 2.2K关注 0票数 2

我有一个巨大的企业数据库(大约500,000)与邮政编码,地址等。我需要按升序显示他们从100英里的用户邮政编码。我有一个邮政编码与相关的纬度和经度的表格。什么是更快/更好的解决方案?

案例1:计算距离并按距离排序。我会有用户当前的邮政编码,纬度和经度的会话。我将使用SQL Server函数计算距离。

案例二:获得50英里范围内的所有邮政编码,并获得所有这些邮政编码的企业。在这里,我将不得不在查找业务时编写一个select in嵌套查询。

我认为案例1将计算数据库中所有业务的距离。而第二种情况只会获取邮政编码,最终只会获取所需的业务。因此,第二种情况应该更好?如果有任何建议,我将不胜感激。

这是我在第一种情况下的LINQ查询。

代码语言:javascript
代码运行次数:0
复制
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#编写的。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-15 20:52:08

除了查看GEOGRAPHY数据类型之外,您还可以做更糟糕的事情,例如:

代码语言:javascript
代码运行次数:0
复制
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列)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8526075

复制
相关文章
SQL 时间查询
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/10/28
2.1K0
优化时间序列应用程序的数据查询
原文地址:https://dzone.com/articles/optimizing-data-queries-for-time-series-applicatio
双愚
2018/06/04
9150
优化时间序列应用程序的数据查询
mysql慢查询优化方法_MySQL查询优化
’mysql慢查询优化 第一步:开启mysql慢查询日志,通过慢查询日志定位到执行较慢的SQL语句。 第二步:利用explain关键字可以模拟优化器执行SQL查询语句,来分析SQL查询语句。 第三步:通过查询的结果进行优化。
全栈程序员站长
2022/11/07
14.6K0
mysql慢查询优化方法_MySQL查询优化
查询优化器概念—查询优化器介绍
查询优化器(简称为优化器)是内置数据库软件,用于确定 SQL 语句访问请求数据的最有效方法。
Yunjie Ge
2022/04/24
1.2K0
查询优化器概念—查询优化器介绍
SQL查询优化
① 给合适的列建立索引,对于大表而言,如果查询的时候不走索引,那查询是非常慢的,查询复杂度为O(N)
用户1260737
2023/01/11
1.5K0
mysql查询优化
很多传统型的公司的数据量都比较小,并且没有DBA这个岗位去对你开发项目中的sql进行一个最终的审核,导致开发的时候写了一些慢sql,数据量小的时候可能还好,一旦数据量上来了,查询效能极低,并且请求次数过多的话很可能会因为这一个慢sql把你整个系统拖垮,不能正常对外提供服务
炒香菇的书呆子
2022/04/14
1.3K0
MySQL查询优化
通过上述参数可以了解当前DB应用是插入更新为主还是查询为主,以及各类的SQL执行比例。
JavaEdge
2021/12/07
1.5K0
MySQL查询优化
MySQL查询优化
通过上述参数可以了解当前DB应用是插入更新为主还是查询为主,以及各类的SQL执行比例。
JavaEdge
2021/10/18
1.6K0
Mongodb 查询优化
A good writeup of how your index should be created is available in Optimizing MongoDB Compound Indexes. Let's take the main point of the article, where the compound index ordering should be equality --> sort --> range:
乐事
2020/05/10
1.1K0
MySQL查询优化
     一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重要。
那一叶随风
2018/08/22
2K0
ClickHouse查询优化
ClickHouse是OLAP(Online analytical processing)数据库,以速度见长^clickhouse_bench。ClickHouse为什么能这么快?有两点原因^why_clickhouse_is_so_fast:
charmer
2022/11/14
2.2K0
ClickHouse查询优化
MySQL 查询优化
要知道为什么使用索引,要知道如何去使用好索引,使自己的查询达到最优性能,需要先了解索引的数据结构和磁盘的存取原理 1. 不使用顺序查找,因为顺序查找比较慢,通过特定数据结构的特点来提升查询速度,这种数
guanguans
2018/06/13
3.8K0
django 时间 日期查询
1、gt:大于某个时间 now = datetime.datetime.now() #前一天 start = now – datetime.timedelta(hours=23, minutes=59, seconds=59) a=yourobject.objects .filter(youdatetimcolumn__gt=start) 2、gte:大于等于某个时间: a=yourobject.objects .filter(youdatetimcolumn__gte=start) 3、
kirin
2020/11/11
3.5K0
Oracle根据时间查询
以下SQL,只会查询2021-01-01至2021-1-2 00:00:00的数据
鱼找水需要时间
2023/02/16
2.1K0
Oracle根据时间查询
hudi时间旅行查询
hudi每次数据写入时都会生成一个时间戳,用于表示数据写入的时间,基于该特性,在进行数据查询时可使用该时间对hudi中数据进行查询。
从大数据到人工智能
2022/08/30
1.3K0
sequlize 查询时间范围和多表查询
前端传参时间范围 如:createdAtFrom = '', createdAtTo = '' ,并且在后端接收参数后给的默认值 ''
用户4793865
2023/01/12
2.6K0
数据库查询优化技术(二):子查询优化
对应的是限制条件(格式类似“field<op>consant”, field表示列对象,op是操作符如"="、">"等)。
sunonzj
2022/06/21
3.3K0
数据库查询优化技术(二):子查询优化
Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引
group by 使用索引的原则几乎跟 order by 一致 ,group by 即使没有过滤条件用到索引,也可以直接使用索引。
半旧518
2022/10/26
2K0
Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引
性能优化-子查询的优化
子查询是我们在开发过程中经常使用的一种方式,在通常情况下,需要把子查询优化为join查询但在优化是需要注意关联键是否有一对多的关系,要注意重复数据。
cwl_java
2020/02/13
1.7K0
es搜索优化&mysql查询优化
这周优化了我们沙抖官网搜索的功能,这个搜索目前是根据视频标题进行匹配,之前是对用户输入的关键词进行了分词查找,比如用户输入【机器人】,这样的话,只要视频标题中有关键词的任意一个字都会被搜到,比如含有【人】字的标题会展示出来,并可能排的很靠前,所以我就对当前的搜索进行了优化,现在搜索是优先进行相邻短语查询 match_phrase,如果相邻短语查询结果小于2个就进行普通的分词查询,这个相邻短语查询是要求在请求字符串中的所有查询项必须都在文档中存在,文中顺序也得和请求字符串一致,且彼此相连。这样查询的话,标题中含有【机器人】的结果肯定在前。
用户4945346
2020/06/16
1.5K0

相似问题

在magento2中应用主题

14

在magento2中创建主题

12

在magento2中添加新主题

231

安装Magento2主题

11

无法从后端安装magento2扩展。为什么?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文