Sql-Server
是否可以在一個查詢中更新所有空間索引範圍?
我在縣政府工作,可能 GIS 數據庫(在 Microsoft SQL Server 2014 上執行)中 95% 的數據都在縣范圍內。
我注意到在某些數據中,空間索引的範圍太大而在某些情況下太小,這導致查詢執行速度比應有的速度慢。
題
有沒有辦法可以執行所有空間索引並更新範圍?我有縣的最小邊界矩形的 X/Y 最小值/最大值加上已經插入的 2 英里緩衝區。
在 ArcGIS 中有一個重建空間索引的功能,但它不會改變索引的範圍。我在文件中看到我必須使用更新的屬性創建一個新索引,並可以選擇刪除具有相同名稱的舊索引。不知道如何編碼。
這通常是我以一致的方式處理重建空間索引的方式。
這假設您的幾何圖形都在同一個投影中並且已經被索引。它將排除通常的 ESRI 地理數據庫系統表。
我避免讓 ArcGIS 創建或維護索引。他們似乎從來沒有在我使用的預測上得到很好的範圍。
declare @sqlCmd nvarchar(4000) declare cSI cursor fast_forward for select 'CREATE SPATIAL INDEX ' + quotename(i.name) + ' ON ' + quotename(sc.name) + '.' + quotename(t.name) + '(' + quotename(c.name) + ') ' + 'USING GEOMETRY_AUTO_GRID WITH ' + '(BOUNDING_BOX = ( xmin=950000, ymin=4500000, xmax=3500000, ymax=7000000 ), ' + -- Alter to suit 'CELLS_PER_OBJECT = 1000, PAD_INDEX = ON, DROP_EXISTING = ON)' sqlcmd from sys.tables t inner join sys.schemas sc on t.schema_id = sc.schema_id inner join sys.indexes i on t.object_id = i.object_id inner join sys.index_columns ic on i.index_id = ic.index_id and ic.object_id = t.object_id inner join sys.columns c on ic.column_id = c.column_id and t.object_id = c.object_id inner join sys.spatial_index_tessellations s on i.index_id = s.index_id and i.object_id = s.object_id where i.type_desc = 'SPATIAL' -- spatial indexes and (t.name not like 'GDB_%' and t.name not like 'SDE_%') -- exclude ESRI system tables open cSI fetch from cSI into @sqlCmd while @@fetch_status = 0 begin print @sqlCmd exec(@sqlCMD) fetch from cSI into @sqlCmd end close cSI deallocate cSI