我编写了一个查询来从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条记录。任何人都可以帮我优化这个查询
答案 0 :(得分:0)
我的猜测是,您的查询的重要部分是from
和where
子句。但是,您可以通过删除以下行来测试:
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条记录