Sql Server几何列导致查询需要很长时间才能运行

时间:2013-09-03 10:33:49

标签: sql sql-server spatial-index spatial-query

我编写了一个查询来从Sql数据库中获取多边形数据。

我有以下查询来获取结果。

SELECT ZIP,
       NAME,
       STABB,
       AREA,
       TYPE,
       orgZc.OrganizationId,
       orgZc.[ZipCode] AS ORGzip,
       REPLACE(REPLACE(REPLACE(REPLACE(GEOM.STAsText(),'POLYGON ((',' '),'MULTIPOLYGON (((',' '),'))',''),')))','')AS WKT
FROM USZIP
INNER JOIN ORGANIZTION_ZIP_CODES orgZc ON orgZc.[ZipCode]=USZIP.zip
WHERE orgZc.OrganizationId=@ORGANIZATION_ID

在这张桌子上,我已经添加了一个空间索引,如下所示

CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1 
ON USZIP(GEOM) WITH ( BOUNDING_BOX = ( -90, -180, 90, 180 ) );

但需要38秒才能获取2483条记录。任何人都可以帮我优化这个查询

2 个答案:

答案 0 :(得分:0)

我的猜测是,您的查询的重要部分是fromwhere子句。但是,您可以通过删除以下行来测试:

   REPLACE(REPLACE(REPLACE(REPLACE(GEOM.STAsText(),'POLYGON ((',' '),'MULTIPOLYGON (((',' '),'))',''),')))','')AS WKT

查看该处理是否占用了大量时间。

对于这部分查询:

FROM USZIP INNER JOIN
     ORGANIZATION_ZIP_CODES orgZc
     ON orgZc.[ZipCode] = USZIP.zip
WHERE orgZc.OrganizationId = @ORGANIZATION_ID;

您说邮政编码是“主要列”。但是,它必须是复合索引(或主键)中的 first 列才能用于连接。所以,你真的希望USZIP(zip)上的索引能够使联接起作用。 (我猜这是真的,基于表的名称,但我想明确。)

其次,您的where条款仅限于一个OriganizationId,可能是很多。如果是这样,您需要ORGANIZATION_ZIP_CODES(OrganizationId)上的索引。或者,更好的是,ORGANIZATION_ZIP_CODES(OrganizationId, ZipCode)

答案 1 :(得分:0)

我找到了解决方案。我添加了一个新列并更新了REPLACE(REPLACE(REPLACE(REPLACE(GEOM.STAsText(),'POLYGON((',''),'MULTIPOLYGON(('',''),'))','') ,')))','')AS WKT现在我可以直接从新添加的列中获取而无需进行任何操作。现在需要3秒才能获取2483条记录