2012-08-29 102 views
4

我有一個表格(表格2),其中包含一些存儲爲地理數據類型的區域(多邊形)。該表包含1529行。在另一個表格(Table1)中,我有約。 22000行,每行都有一個X/Y,我可以從中創建存儲在地理欄中的點。SQL Server空間查詢優化

我需要做一個空間連接來找出每個點屬於哪個區域。我在兩個表上都創建了空間索引,但我認爲查詢太慢了。現在,它需要約72秒,以使加入的是這樣的:

SELECT ... 
FROM [DatabaseA].dbo.Table1 t1 
INNER JOIN [DatabaseB].dbo.Table2 t2 ON t1.Geo.STIntersects(t2.Geo) = 1 
WHERE t2.ObjectTypeId = 1 AND t2.CompanyId = 3 

請注意,這兩個表在不同的數據庫,但在同一臺服務器上。

在創建空間索引之前,查詢速度非常慢,我可以看到正在使用該索引。但是,在table2上創建索引不會影響性能,只有table1上的索引會提供更好的性能。兩個指數具有較高的水平格柵

當我看的執行計劃,我注意到一個篩選一部分花費的時間71%:

CASE WHEN [Expr1015]>(2) THEN CASE WHEN [Expr1016]=[Expr1017] THEN (1) ELSE (0) END ELSE [DatabaseA].[dbo].[Table1].[Geo] as [t].[Geo].STIntersects([DatabaseB].[dbo].[Table2].[Geo] as [g].[Geo]) END=(1) 

所以,我的問題是:

若本查詢需要這麼久? 我應該使用其他網格尺寸嗎? 那個過濾器表達式是什麼意思?

有沒有人有提示優化呢?

+0

與許多問題非常相似,請參閱我對此的迴應:http:// stackoverflow。COM /問題/ 7655408/SQL的空間加入/ 7672934#7672934 – CatchingMonkey

+0

SQL Server 2008或2012? – AakashM

+0

@CatchingMonkey:正如我寫的,該指數已被使用,因此增加了一絲不上的表現有所幫助。 – user1632306

回答

1

簡而言之,您使用參數t2.Geo調用函數,該函數必須由函數對t2中的所有值進行求值,其中t2.ObjecttypeId = 1且t2.CompanyId = 3。表t2並沒有真正的幫助,因爲它不能使用這些預先計算的索引值。相反,它必須首先在t2中的所有值上運行函數t1.Geo.STIntersects(t2.Geo) - 它們與預先計算的索引值幾乎沒有關係。

如果速度是您的目標並且您有存儲空間,那麼您可以創建第三個表格,其中包含t1.Geo.STIntersects(t2.Geo)的每種組合的預計算結果。然後,您可以將t1和t2連接到第三個表中的預計算值,該表應該能夠產生幾乎即時的查詢結果(對於包含1,529和22,000條記錄的源表)。

如果t1和t2中的數據是相對靜態的,您可以手動重新運行一個查詢來更新第三個表中的數據。如果頻繁更改,則可以通過更新,插入和刪除到t1和t2的觸發器自動維護,或者可以將更新,插入和刪除操作包裝到更新預計算表的存儲過程中。

+0

我與大空間數據集(10K +記錄)的工作越多,我看到需要已經計算表中存儲任何關係和屬性我想找到。空間索引可以讓您在很短的時間內完成很多工作,但對於有用戶等待查詢結果的OLTP系統來說,這並不實際。至少當你有很多數據時,空間通常就是這樣。確定相交點,最近的鄰居等,並將其存儲在一個表中。根據需要經常刷新。 – radpin

2

我有類似的問題。我有2000點和85000多邊形。我需要匹配具有匹配多邊形的點。最初那個查詢需要8個小時。

SELECT Item.Name, Polygons.Name 
FROM dbo.Geofence AS Polygons 
JOIN dbo.ItemLocation AS Points 
ON Polygons.GeoFence.STIntersects(Points.GeoLocation) = 1 

問題是點表具有非聚集索引。添加聚集索引將時間縮短爲12秒。

添加空間索引(下面的代碼)將時間減少到1秒。我還在積分表中添加了一個。

CREATE SPATIAL INDEX [SpatialIndex-Polygons] ON dbo.Polygons 
(
    [Geofence] 
)USING GEOGRAPHY_GRID 
WITH (GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]