我有一个表(Table2),其中包含一些存储为地理数据类型的区域(多边形)。该表包含 1529 行。在另一个表(表 1)中,我有大约。22000 行,每行都有一个 X/Y,我从中创建存储在 Geography 列中的点。
我需要进行空间连接以找出每个点属于哪个区域。我在两个表上都创建了空间索引,但我认为查询太慢了。现在,连接大约需要 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)
所以,我的问题是:
这个查询应该花这么长时间吗?我应该使用其他网格尺寸吗?该过滤器表达式是什么意思?
有人有优化这个的提示吗?