我有一张表(Table2),其中包含作为地理数据类型存储的一些区域(多边形)。该表包含1529行。
在另一张表(Table1)中,我有大约22000行,每行都有一个X/Y值,我将其创建为存储在地理列中的点。
我需要进行空间连接以找出每个点属于哪个区域。我已经在两个表上创建了空间索引,但我认为查询速度太慢了。现在,进行连接大约需要72秒,查询语句如下:
请注意,这两个表位于不同的数据库但在同一台服务器上。
在创建空间索引之前,查询速度非常慢,我可以看到索引正在被使用。然而,在table2上创建索引并不影响性能,只有在table1上创建索引才能提高性能。这两个索引都具有高级网格。
当我查看执行计划时,我注意到一个过滤器部分占用了71%的时间:
我需要进行空间连接以找出每个点属于哪个区域。我已经在两个表上创建了空间索引,但我认为查询速度太慢了。现在,进行连接大约需要72秒,查询语句如下:
SELECT ...
FROM [DatabaseA].dbo.Table1 t1
INNER JOIN [DatabaseB].dbo.Table2 t2 ON t1.Geo.STIntersects(t2.Geo) = 1
WHERE t2.ObjectTypeId = 1 AND t2.CompanyId = 3
请注意,这两个表位于不同的数据库但在同一台服务器上。
在创建空间索引之前,查询速度非常慢,我可以看到索引正在被使用。然而,在table2上创建索引并不影响性能,只有在table1上创建索引才能提高性能。这两个索引都具有高级网格。
当我查看执行计划时,我注意到一个过滤器部分占用了71%的时间:
CASE WHEN [Expr1015]>(2) THEN CASE WHEN [Expr1016]=[Expr1017] THEN (1) ELSE (0) END ELSE [DatabaseA].[dbo].[Table1].[Geo] as [t].[Geo].STIntersects([DatabaseB].[dbo].[Table2].[Geo] as [g].[Geo]) END=(1)
所以,我的问题是:
这个查询是否应该花费如此长的时间? 我应该使用其他网格尺寸吗? 那个过滤表达式是什么意思?
有人有优化这个的提示吗?