Sql-Server

是否可以在一個查詢中更新所有空間索引範圍?

  • September 6, 2017

我在縣政府工作,可能 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

引用自:https://dba.stackexchange.com/questions/185197