我在處理數據庫中的一個非常大的表格時遇到了一些麻煩。在討論這個問題之前,先談談我想達到的目標。在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'語法,不鼓勵使用 –