0

我编写了一个查询来从 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 ) );

但是获取 2483 条记录需要 38 秒。谁能帮我优化这个查询

4

2 回答 2

0

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

   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;

您说邮政编码是“主要列”。但是,它必须是复合索引(或主键)中的第一列才能用于连接。所以,你真的想要一个索引USZIP(zip)来让连接工作。(根据表的名称,我猜这是真的,但我想明确一点。)

其次,您的where条款仅限于一个OriganizationId,大概是许多。如果是这样,你想要一个关于ORGANIZATION_ZIP_CODES(OrganizationId). 或者,更好的是,在ORGANIZATION_ZIP_CODES(OrganizationId, ZipCode).

于 2013-09-03T11:03:39.300 回答
0

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

于 2013-09-04T06:09:46.997 回答