有什么建议加快缓慢的地理查询?

问题描述 投票:0回答:1

我们有一个客户表,每个人的位置都是地理列,还有一个分支办公室表,每个人的位置都是地理列(我们从纬度和经度列填充地理列)

我们需要根据地理列运行一个查询(视图),以便向每个客户显示最近的分支机构,并且它可以与几千个客户一起运行。我们刚收到一份需要与700,000名客户合作的大工作,需要花费数小时才能运行。任何人都可以建议任何方法来加速这个SQL?

WITH CLOSEST AS (
    SELECT *, ROW_NUMBER() 
    OVER (
        PARTITION BY CustNum
        ORDER BY Miles
    ) AS RowNo 
    FROM 
(
SELECT 
CustNum,
BranchNum, 
CONVERT(DECIMAL(10, 6), (BranchLoc.STDistance(CustLoc)) / 1609.344) AS Miles
FROM 
Branch_Locations
CROSS JOIN
Cust_Locations
) AS T
)
SELECT TOP 100 PERCENT CustNum, BranchNum, Miles, RowNo FROM CLOSEST WHERE RowNo = 1 ORDER BY CustNum, MILES

有没有办法将距离比较放入JOIN?到目前为止,没有任何想法......

谢谢你的任何建议!

sql sql-server tsql geography
1个回答
0
投票

所以,你在这里做的是计算从每个点到另一个点的距离,然后排名。 SQL Server Spatial实际上是以完全不必要的方式设置的。

您要做的第一件事是在每个表上创建一个空间索引;关于如何做到这一点的文档可以找到here.不要过多担心这里的具体参数,你可以通过调整它们来提高性能,拥有空间索引可以大大提高性能。

你要做的第二件事是确保使用空间索引;有关如何确保发生这种情况的文档可以找到here.确保过滤掉任何空的空间信息!

所以,迄今为止所说的是一种方法,可以在另一长表中找到最接近的点;但这是SQL Server,我们想以此集为基础!

我的建议是使用一些先验知识并使用它来编写查询。

WITH CLOSEST AS (
  SELECT 
    C.CustNum,
    B.BranchNum, 
    ROW_NUMBER() OVER (PARTITION BY C.CustNum ORDER BY B.BranchLoc.STDistance(C.CustLoc)/1609.344 ASC) AS Miles
  FROM 
    Branch_Locations B
  INNER JOIN
    Cust_Locations C
  ON
    B.BranchLoc.STDistance(C.CustLoc)/1609.344 < 100 --100 miles as a maximum search distance is a reasonable number to me
  WHERE
    B.BranchLoc IS NOT NULL
    AND C.CustLoc IS NOT NULL
) AS T

SELECT 
  CustNum, 
  BranchNum, 
  Miles, 
  RowNo 
FROM 
  CLOSEST 
WHERE 
  RowNo = 1 
ORDER BY 
  CustNum, 
  MILES

您可以使用其他技术,例如我的响应here,,但在一天结束时,最重要的内容是创建空间索引并确保使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.