У меня есть этот запрос:
SELECT
[ID], [geom] AS geom , [Label], [Style]
FROM
[ogc].[0006000004C9]
WHERE
[geom] IS NOT NULL
AND [geom].STIsValid() = 1
AND ([geom].STArea() = 0 OR [geom].STArea() > 79.3734125)
AND ([geom].STLength() = 0 OR [geom].STLength() > 39.68670625)
AND [geom].STIntersects(@g) = 1
Таблица содержит ~ 700 000 строк.И запрос возвращает ~ 70 000 строк и занимает 9 секунд.
В плане выполнения я вижу, что пространственная операция (STIntersects()
) занимает всего 1%.Но поиск по кластерному индексу занимает 71%.

Внутри этого поиска:

Вот мой PK:
ALTER TABLE [ogc].[0006000004C9]
ADD CONSTRAINT [PK_0006000004C9]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Что такое расширенный индекс, это мой PK или запрос игнорирует его?Как я могу улучшить время выполнения?
Другая информация:
- SQL Server 2014
- Уровень совместимости 120
Структура таблицы:
CREATE TABLE [ogc].[0006000004C9]
(
[ID] [INT] IDENTITY(1,1) NOT NULL,
[geom] [GEOMETRY] NOT NULL,
[Object_ID] [CHAR](12) NOT NULL,
[Sector_ID] [CHAR](12) NOT NULL,
[Style] [CHAR](12) NOT NULL,
[StyleName] [VARCHAR](MAX) NULL,
[Label] [VARCHAR](80) NULL,
CONSTRAINT [PK_0006000004C9]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ОБНОВЛЕНИЕ Когда я удаляю STIntersection (), мой запрос:
SELECT
[ID], [geom] AS geom , [Label], [Style]
FROM
[ogc].[0006000004C9]
WHERE
[geom] IS NOT NULL
AND [geom].STIsValid() = 1
AND ([geom].STArea() = 0 OR [geom].STArea() > 79.3734125)
AND ([geom].STLength() = 0 OR [geom].STLength() > 39.68670625)
AND [geom].STIntersects(@g) = 1
В плане я вижу:
[![enter image description here][3]][3]
И этотак мило.Actual и Estimeted - это то же самое, никаких расширенных индексов.И запрос занимает всего 8 seconds
.Так что с STIntersects
запрос работает 9 seconds
.Так 8 секунд это нормальная ситуация или она медленная и есть какие-то способы ее доказать?