我在处理数据库中的一个非常大的表格时遇到了一些麻烦。在讨论这个问题之前,先谈谈我想达到的目标。在SQL Server性能上处理非常大的表格
我有两个源表:
- 源1:
SALES_MAN (ID_SMAN, SM_LATITUDE, SM_LONGITUDE)
源2:
CLIENT (ID_CLIENT, CLATITUDE, CLONGITUDE)
目标:
DISTANCE (ID_SMAN, ID_CLIENT, SM_LATITUDE, SM_LONGITUDE, CLATITUDE, CLONGITUDE, DISTANCE)
的想法是找到顶部对于使用012的每个客户,N最接近SALES_MAN
目标表中的。
我在做什么目前正在计算每一个客户和每一个销售人之间的距离:
INSERT INTO DISTANCE ([ID_SMAN], [ID_CLIENT], [DISTANCE],
[SM_LATITUDE], [SM_LONGITUDE], [CLATITUDE], [CLONGITUDE])
SELECT
[ID_SMAN], [ID_CLIENT],
geography::STGeomFromText('POINT('+IND_LATITUDE+' '+IND_LONGITUDE+')',4326).STDistance(geography::STGeomFromText('POINT('+DLR.[DLR_N_GPS_LATTITUDE]+' '+DLR.[DLR_N_GPS_LONGITUDE]+')',4326))/1000 as distance,
[SM_LATITUDE], [SM_LONGITUDE], [CLATITUDE], [CLONGITUDE]
FROM
[dbo].[SALES_MAN], [dbo].[CLIENT]
的DISTANCE
表中包含大约1 milliards行。
第二步让每个客户端我5最近的销售人是无法运行此查询:
SELECT *
FROM
(SELECT
*,
ROW_NUMBER() OVER(PARTITION BY ID_CLIENT ORDER BY DISTANCE) rang
FROM DISTANCE) TAB
WHERE rang < 6
最后查询确实是一件费时的。所以为了避免SORT运算符,我尝试在DISTANCE和ID_CLIENT中创建一个排序的非聚集索引,但它不起作用。我也尝试在两个索引中包含所有需要的列。
但是,当我在DISTANCE
上创建聚簇索引并将非聚簇排序索引保留在ID_CLIENT
中时,情况变得更好。
那么在这种情况下非聚类排序索引不起作用?
但是,当我使用聚集索引,我有加载数据的其他问题,我有点强迫删除它开始加载过程之前。
那么你怎么看?以及我们如何处理这种表格,以便能够选择,插入或更新数据而不存在性能问题?
非常感谢
[不良习惯踢:使用旧样式的JOIN(http://sqlblog.com/ blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 旧式*逗号分隔的table * style列表被替换为* proper *在ANSI - ** 92 ** SQL标准(** 25年**前)中使用ANSI'JOIN'语法,不鼓励使用 –