Почему пространственный индекс не используется?
Фон
Я пытаюсь научиться пользоваться geometry
Тип данных в SQL Server и шутит с простым примером.
Теперь я сталкиваюсь с проблемами отсутствия оптимизатора запросов с использованием пространственного индекса, созданного в моей тестовой таблице. Насколько я вижу из документации, тип соединения, которое я выполняю, должен быть совместим с пространственным индексом.
Что мне здесь не хватает?
Код
Код для автономного рабочего примера (CTRL+M для включения фактического плана выполнения):
CREATE TABLE dbo.GeometryTest
(
id int PRIMARY KEY CLUSTERED NOT NULL,
temppos geometry NOT NULL
)
CREATE SPATIAL INDEX IX_temppos ON dbo.GeometryTest (temppos)
USING GEOMETRY_AUTO_GRID WITH (
BOUNDING_BOX = (
0, 0, 1000, 1000
)
)
;
-- This CTE is just used to produce multiple rows without a loop
WITH
L0 AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n
FROM L5)
INSERT dbo.GeometryTest SELECT TOP 100 n, geometry::STPolyFromText(CONCAT('POLYGON ((',n*10,' ',n*10,',',n*10+15,' ',n*10,',',n*10+15,' ',n*10+15,',',n*10,' ',n*10+15,',',n*10,' ',n*10,'))'), 0) FROM Nums
SELECT * FROM dbo.GeometryTest a INNER JOIN dbo.GeometryTest b ON b.temppos.STOverlaps(a.temppos) = 1
IF EXISTS (SELECT 1 WHERE OBJECT_ID('dbo.GeometryTest') IS NOT NULL) DROP TABLE dbo.GeometryTest