Запрос SQL Paging (Offset, Fetch) очень медленный

Я не понимаю, что здесь происходит. Я запрашиваю одну таблицу, как показано в моем запросе ниже. Я получаю только первые 20 записей, но выполнение запроса занимает 24 секунды.

Есть ли способ ускорить этот поисковый запрос?

;WITH TempResult AS(
     SELECT distinct


       D.GLCompany
      ,D.GLAcct
      ,D.GLProdNum
      ,D.GLCostCenter         
      ,D.FCSCompany
      ,D.FCSAcct
      ,D.FCSCostCenter     
      ,D.JournalDetailId
      ,D.[EffDt]
      ,D.[JournalLineAmt]
      ,D.[JournalLineDesc]     
      ,D.[ManagedByCd]
      ,D.[LegalOwnerId]
      ,D.[JournalLineNum]
      ,D.[RoundedFlagBit]
      ,D.[CLPreValErrCd]
      ,D.[GLPreValErrCd]
      ,D.[SuspenseErrCd]
      ,D.GLProfitCenter
      ,D.GLTradingPartner
      ,D.GLInternalOrder
      ,D.GLSubAcct
      ,D.GLAcctActivity
      ,D.GLDataSrc
      ,D.GLId
      ,D.GLProdGrp 
      ,D.HeaderId   
     from MyDetail  D
 )


    SELECT *  FROM TempResult
 ORDER BY  TempResult.HeaderId
  OFFSET 0  ROWS
 FETCH NEXT 20 ROWS ONLY
 OPTION(RECOMPILE)

Существует некластеризованный индекс для заголовка, как показано ниже.

CREATE NONCLUSTERED INDEX [FCSAcctJournalDetail_idx] ON [dbo].[MyDetail]
(
    [FCSAcct] ASC,
    [FCSCompany] ASC,
    [JournalEntryEffDt] ASC,
    [DataDt] ASC,
    [HeaderId] ASC,
    [JournalDetailId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

1. distinct .2. КОМПЕНСИРОВАТЬ

Lukasz Szozda 10.06.2019 19:50

Да, я отключил Distinct, и время сократилось до 9 секунд. Тем не менее это медленно для всего 20 записей

Terrance Jackson 10.06.2019 19:51

У вас есть индекс по HeaderId? Вам действительно нужен DISTINCT?

Milney 10.06.2019 19:51

MyDetail обычная таблица или представление?

Lukasz Szozda 10.06.2019 19:51

@LukaszSzozda это обычный стол.

Terrance Jackson 10.06.2019 19:51

А индексы какие?

David Browne - Microsoft 10.06.2019 19:52

@Milney Да, для HeaderId есть некластеризованный индекс вместе с несколькими другими столбцами в этом выражении.

Terrance Jackson 10.06.2019 19:53

Запрос, который вы разместили, не нуждается в CTE.

Zohar Peled 10.06.2019 19:55

Кроме того, почему подсказка recompile?

Zohar Peled 10.06.2019 19:55

Этот индекс бесполезен в этом запросе. Вам нужно ORDER BY ведущих столбцов в индексе, чтобы избежать полной пересортировки таблицы для получения первых 20 строк.

David Browne - Microsoft 10.06.2019 19:58

Технически у вас НЕТ индекса для HeaderID. HeaderID «включен» в индекс, которым вы поделились, но он так далеко в списке, что сортировка только по «header_id» не имеет большого значения. Столбцы, перечисленные в индексе, определяют порядок данных индекса. Если требуется сортировка по HeaderID, я бы добавил индекс NC только для HeaderID. Представьте, что вы сортируете файл Excel с людьми по Last_Name, First_Name и Birth_Date... а затем пытаетесь найти всех людей с датой рождения в июне. Тот факт, что дата рождения включена в сортировку после имен... не поможет.

jamie 10.06.2019 20:17

Сортировка по дате рождения помогает, когда у вас есть кто-то с таким же именем, но совсем не помогает при поиске в наборе данных.

jamie 10.06.2019 20:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
330
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте индекс на HeaderId:

CREATE NONCLUSTERED INDEX [FCSAcctJournalDetail_HeaderId_idx] ON [dbo].[MyDetail]
(
    [HeaderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

Как написал Дэвид Браун в своем комментарии, индекс, который у вас есть в настоящее время, не имеет отношения к этому запросу.

Если бы HeaderId был первым столбцом в индексе, он был бы релевантным, но поскольку он не первый (и даже близко не первый), он просто не имеет значения в контексте этого запроса.

Другие вопросы по теме