2015-04-06 52 views
0

[更新]我想下面的索引定义并收到以下错误消息: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服务器实例,所以我不想忍受我的重试限制:-)。

谢谢!

回答

1

空间索引确实需要一点时间适应,但一旦你做了,它们就非常简单。

首先,只能在空间列上创建空间索引 - 即那些类型为GEOMETRYGEOGRAPHY的空间索引。在你的实例中,你有一个单独的列“[Point]”,所以这是你应该并且可以索引的唯一列。

运行涉及空间数据的查询时,生成的查询计划通常非常高效,对WHERE子句的该部分使用空间索引,对WHERE子句的其他部分使用其他非空间索引。

至于网格层次,不幸的是它可能是反复试验,因为它最终取决于您的数据。当你开始使用设置时,通常我发现你只能节省毫秒 - 在大多数情况下。从HHHH开始,每个物体16个细胞。如果对结果不满意,请检查查询计划以确保它正在被使用,如果是,请对其进行调整。

如果您确实想了解空间索引,我建议您查看Alistair Aitchison的“Pro Spatial with SQL Server 2012”。它确实是在SQL中使用Spatial数据的圣经,而Alistair在这方面做得非常出色。

+0

谢谢@Jon_Bellamy! – 2015-04-06 20:45:47

+0

Doh,这没有奏效。更新后的问题:-) – 2015-04-07 03:11:51

+0

@WillLopez好的,但您的选择在这一点上非常明显。要么表现不佳,要么保留计算列,要么不计算,并享受空间索引的好处。你如何输入数据到表中?最好的解决方案是编辑插入来处理Point列的计算 - 而不是将其作为计算列。 – 2015-04-07 06:27:42