Згідно з документами Microsoft, просторові індекси будуть використовуватися для типів географії за такими методами, коли вони з’являються на початку предиката порівняння з WHERE
пунктом:
STIntersects
STDistance
STEquals
Лише методи типів геометрії (обмежений список) спричинить використання просторового індексу JOIN ... ON
, тому змініть свій код на використання WHERE geog1.STIntersects(geog2) = 1
і це повинно підвищити швидкість.
Я також рекомендую порадитись у відповідь g2server та додати наступне для фільтрації та додавання на неї просторового індексу
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
ви могли б мати запит , як таке (я писав цей пост швидко і ще не перевірили, це просто що - то спробувати , тому що я бачив , що ваш запит і наівисочайшіе Відправлені відповіді використовувати JOIN ON просторових оп = 1 , який не використовуватиме просторовий індекс):
SELECT
(SELECT p2.polygon_id
FROM T_Polygon p2
WHERE p2.coords.STIntersects(t.coords) = 1),
t.pin_id
FROM T_PIN t
WHERE
(SELECT t.coords.STIntersects(p.coords)
FROM T_POLYGON p
WHERE t.coords.STIntersects(p.SimplePolysGeog) = 1) = 1
FYI: Вищезгадане не працює, якщо в SimplePolysGeog
кінцевому підсумку перекриваються (як у штифті може бути в двох спрощених географах, просто запустили це на людей по дільницях у штаті, і оскільки нормальні поліси діляться кордоном, обмежувальні поля перекриваються), тому в більшості використовуйте випадків, це призведе до помилки, що підзапит повернув більше одного результату.
З огляду просторових індексів MS Docs :
Методи географії, що підтримуються просторовими індексами
За певних умов просторові індекси підтримують такі методи, орієнтовані на задані географії: STIntersects (), STEquals () та STDistance (). Щоб підтримуватися просторовим індексом, ці методи повинні використовуватися в пункті WHERE запиту, і вони повинні виникати в межах предиката такої загальної форми:
geography1.method_name (geography2) порівняння_operatorvalid_number
Для повернення ненульового результату географія1 та географія2 повинні мати однаковий ідентифікатор просторового довідника (SRID) . В іншому випадку метод повертає NULL.
Просторові індекси підтримують такі форми предикатів:
Запити, що використовують просторові індекси
Просторові індекси підтримуються лише у запитах, які включають індексований просторовий оператор у пункті WHERE. Наприклад синтаксис, такий як:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Оптимізатор запитів розуміє комунікативність просторових операцій (що @a.STIntersects(@b) = @b.STInterestcs(@a)
). Однак просторовий індекс не буде використовуватися, якщо початок порівняння не містить просторового оператора (наприклад WHERE 1 = spatial op
, просторовий індекс не буде використовувати). Щоб використовувати просторовий індекс, перепишіть порівняння (наприклад WHERE spatial op = 1
).
...
Наступний запит буде працювати, якщо вони SimplePolysGeogs
перетинаються:
;WITH cte AS
(
SELECT T_PIN.PIN_ID,
T_POLYGON.POLYGON_ID,
T_POLYGON.COORD
FROM T_PIN
INNER JOIN T_POLYGON
ON T_PIN.COORD.STIntersects(T_POLYGON.SimplePolysGeog) = 1
)
SELECT COUNT(*)
FROM T_PIN
INNER JOIN cte
ON T_PIN_PIN_ID = cte.PIN_ID
where cte.[COORD].STIntersects(T_PIN.COORD) = 1