Попытка увидеть, как я могу улучшить производительность этого запроса SQL - PullRequest
1 голос
/ 27 апреля 2011

У меня есть запрос SQL, который пытается найти все окрестности в некоторых округах.

Когда я использую SQL Sentry Plan Explorer для визуализации запроса (IMO, немного лучше, чем инструменты, поставляемые с MS SSMS), он выделяет действительно медленно выполняющуюся часть: -

Полный план

enter image description here

Увеличено ....

enter image description here

Подробнее

enter image description here

SQL-скрипт:

 -- Update which Neighbourhoods are in these Counties.
INSERT INTO @NeighbourhoodCounties (NeighbourhoodId, CountyId)
 SELECT SubQuery.NeighbourhoodId, SubQuery.CountyId
 FROM (
  SELECT e.LocationId AS NeighbourhoodId, b.LocationId AS CountyId, 
      c.OriginalBoundary.STArea() AS CountyArea,
      c.OriginalBoundary.STIntersection(d.OriginalBoundary).STArea() AS IntersectionArea
  FROM @CountyIds a
   INNER JOIN [dbo].[Counties] b ON a.Id = b.LocationId
   INNER JOIN [dbo].[GeographyBoundaries] c ON b.LocationId = c.LocationId
   INNER JOIN [dbo].[GeographyBoundaries] d ON c.OriginalBoundary.STIntersects(d.OriginalBoundary) = 1
   INNER JOIN [dbo].[Neighbourhoods] e ON d.LocationId = e.LocationId
   ) SubQuery
    WHERE (SubQuery.IntersectionArea / SubQuery.CountyArea) * 100 > 5 -- a Neighbourhood has to be 5% or more to be considered 'Inside'

Может кто-нибудь помочь интерпретировать этот запрос? Что означают все эти цифры? Как я могу использовать эти цифры для диагностики и улучшения моего запроса?

Я пытался создать индексированное представление для пространственной таблицы , но это с треском провалилось.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 27 апреля 2011

Это было бы нормально. У вас нигде нет толстых прутьев, в основном ищущих.

Однако я вижу, что у вас есть функция для столбца в JOIN

ON c.OriginalBoundary.STIntersects(d.OriginalBoundary) = 1

Это не поможет. И вычисленный столбец тоже не поможет

И у вас также есть вычисление для столбцов в WHERE = non-sargable

(SubQuery.IntersectionArea / SubQuery.CountyArea) * 100

На первый взгляд, поиск 64,5%, вероятно, является следствием этих JOIN и работы оптимизатора вокруг них

...