[更新]我想下面的索引定義並收到以下錯誤消息:Azure的SQL Server空間指數誤差不能創建...因爲列計算
Cannot create primary xml, selective xml or spatial index 'SI_Property' on table 'BTSOne.dbo.Properties', column 'Point', because the column is computed.
這是有道理的,但現在我回來了到一個方。
我試圖這樣做的原因是什麼?由於查詢超時。我爲所有其他查詢設置了索引,除了空間查詢之外,它們是執行查詢的主要類型。
我有點困惑在哪些列上創建空間索引。我擔心,因爲有些記錄缺少影響點列(索引列)的經度和緯度值(默認爲零)。起初我以爲我可以在點欄上創建索引,但閱讀關於此問題的文章表明我使用了多列。我讀得越多,我就變得越迷惑。此外,還有正確設置網格的問題。經驗法則似乎將它們設置爲高。
這些都是相關的表列:
[Latitude] [float] NULL CONSTRAINT [DF_Properties_Latitude] DEFAULT ((0)),
[Longitude] [float] NULL CONSTRAINT [DF_Properties_Longitude] DEFAULT ((0)),
[Point] AS ([geography]::Point([Latitude],[Longitude],[SRID])),
[SRID] [int] NULL CONSTRAINT [DF_Properties_SRID] DEFAULT ((4326)),
這是存儲過程的相關部分:
DECLARE @SearchPoint as geography,
@Region nvarchar(80)
SET @SearchPoint = geography::Point(@Latitude, @Longitude, 4326)
DECLARE @tempTable dbo.WorkingProperties
SELECT [PropertyId] AS "Id", ISNULL([InnCode],'NA') AS "InnCode", [UseName] AS "OfficeName", [Addr1] As "Address", [City]
, [Zip] AS "PostalCode", [CountryCode], [Brand], [BrandCode] ,[Latitude], [Longitude],
([Point].STDistance(@SearchPoint)/1000) AS "Distance",
NULL AS "ProjectType",'Properties' As "Source", [GlobalRMArea]
FROM [BTSOne].[dbo].[Properties]
WHERE [Point].STDistance(@SearchPoint) <= (@intRadiusKm * 1000)
AND OpenStatus = 'Open'
ORDER BY "Distance"
這是我會怎樣創建索引:
CREATE SPATIAL INDEX [SI_Property] ON [BTSOne].[dbo].[Properties]
(
[Point]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),
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]
GO
我正在一個非常有限的訪問環境中工作,所以我沒有太多的嘗試和錯誤的奢侈品nd我沒有直接訪問sql服務器實例,所以我不想忍受我的重試限制:-)。
謝謝!
謝謝@Jon_Bellamy! – 2015-04-06 20:45:47
Doh,這沒有奏效。更新後的問題:-) – 2015-04-07 03:11:51
@WillLopez好的,但您的選擇在這一點上非常明顯。要麼表現不佳,要麼保留計算列,要麼不計算,並享受空間索引的好處。你如何輸入數據到表中?最好的解決方案是編輯插入來處理Point列的計算 - 而不是將其作爲計算列。 – 2015-04-07 06:27:42