Почему Clustered Index Seek работает медленно? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть этот запрос:

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%.

enter image description here

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

enter image description here

Вот мой 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 секунд это нормальная ситуация или она медленная и есть какие-то способы ее доказать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...