簡體   English   中英

需要幫助來優化可能錯誤的空間SQL查詢

[英]Need help to optimize potentially erroneous spatial SQL query

更新 :自撰寫本文以來,我們決定將我們的地理空間數據遷移到ElasticSearch數據庫,從而產生更好的結果。

我是SQL的新手,我需要幫助來優化空間查詢,以便它在2秒內運行。 我們已經在各個網站上嘗試了一些建議(更多內容見下文)。

背景

我們有一個表[Id,Geometry],大約300,000個不同大小和復雜度的幾何形狀,存儲為幾何數據類型。 我們使用下面的代碼片段為Geometry創建了一個空間索引。

CREATE SPATIAL INDEX [IX_Geometry_Spatial]
ON [dbo].[Geometries] ([Geometry]) USING  GEOMETRY_AUTO_GRID 
WITH  (
        BOUNDING_BOX = (XMAX = 24.43359375, XMIN = 10.810546875, YMAX = 69.2249968541159, YMIN = 55.2791152920156)
      );

我們想要的是找到與輸入幾何形狀相交的所有幾何形狀。 這是通過使用以下查詢完成的。

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POLYGON ((x0 y0, ...))', 4326); -- A Worst Case Polygon containing 1442 data points

SELECT Count(Id)
FROM Geometries
WHERE Geometries.Geometry.Filter(@g.Reduce(.25)) = 1

對於某些最壞情況的輸入幾何形狀(大的,復雜的多邊形),這種執行大約需要7-10秒。

這是查詢的執行計划: 在此輸入圖像描述

我們可以看到我們擊中了空間索引,但最昂貴的操作是clustered index seek (Clustered)

聚集索引尋求詳細信息:

在此輸入圖像描述

空間索引尋求細節:

在此輸入圖像描述

問題

不應該通過空間索引而不是聚集索引來完成繁重的工作嗎?

可以通過更改空間索引的設置來改進查詢嗎? 我們應該使用什么設置(對於GRIDS,CELLS_PER_OBJECT等)?

如何將整個執行時間縮短,或者這種查詢可以達到7-10秒?

我們嘗試了什么,這有幫助

每個都節省了大約幾秒鍾。

  • 檢查索引碎片和重建索引。
  • STIntersect()Filter()交換方法
  • 使用Reduce(.25)減少輸入幾何Reduce(.25) 這將幾何從1442個數據點減少到7.(如果我們決定使用它,它必須是不同輸入的動態,但這是另一個問題。)
  • 引入了一個新的表格列SimpleGeometry ,其中包含Geometry列中所有幾何對象的邊界框。 創建了一個新的SimpleGeometry空間索引,並使用SimpleGeometry進行查找而不是Geometry (在查詢示例中未使用。)

如果您在每次添加新形狀時進行計算,然后僅將交叉點存儲在表格中,該怎么辦? 現在您的查詢是即時的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM