как создать индекс для ускорения поиска данных - PullRequest
1 голос
/ 08 мая 2019

У меня есть этот запрос ниже, он получает более 6000 строк с сервера, загруженные данные только 317 КБ, но это занимает почти 25 секунд или время ожидания сервера IIS.

-- Region Parameters
DECLARE @p0 Int = 0
DECLARE @p1 NVarChar(1000) = 'sample.user'
DECLARE @p2 Int = 0
DECLARE @p3 NVarChar(1000) = 'sample.user'
-- EndRegion
SELECT [t0].[Id], [t0].[DocNumber], [t0].[DocStatus], [t0].[Title], [t0].[SubmittedDate], [t0].[CreatedBy], [t0].[ApprovedByStep], [t0].[RoutedFor], 
    (CASE 
        WHEN [t2].[test] IS NULL THEN NULL
        ELSE [t2].[ApprovedBy]
     END) AS [HistApprovedBy]
FROM [TESTDB].[dbo].[SampleTable] AS [t0]
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[RequestId], [t1].[DocType], [t1].[ApprovedBy]
    FROM [TESTDB].[dbo].[SampleHistories] AS [t1]
    ) AS [t2] ON ([t0].[Id] = [t2].[RequestId]) AND (@p0 = [t2].[DocType])
WHERE ([t0].[CreatedBy] = @p1) OR (([t0].[DocStatus] <> @p2) AND ([t0].[CreatedBy] <> @p3))
ORDER BY [t0].[DocNumber]

Я прочитал, что индексирование может ускорить поиск данных, как мне создать индекс SQL-запроса выше? и если у вас есть предложения о том, как ускорить его. Буду признателен.

Нажмите здесь для плана действий

Для справки. Вот мой LINQ

var vm = (from splTbl in SampleTable
      join splsplHist in SamplesplHistories on
      new
      {
          Key1 = splTbl.Id,
          Key2 = 0
      }
      equals
      new
      {
          Key1 = splHist.RequestId,
          Key2 = splHist.DocType
      }
      into subsplHists
      from subsplHist in subsplHists.DefaultIfEmpty()
      where (splTbl.CreatedBy == "sample.user")
            || (splTbl.DocStatus != 0 && splTbl.CreatedBy != "sample.user")
      orderby splTbl.DocNumber
      select new
      {
          splTbl.Id,
          splTbl.DocNumber,
          splTbl.DocStatus,
          splTbl.Title,
          splTbl.SubmittedDate,
          splTbl.CreatedBy,
          splTbl.ApprovedByStep,
          splTbl.RoutedFor,
          splHistApprovedBy = (subsplHist == null ? null : subsplHist.ApprovedBy)
      }
    ).ToList()
    .GroupBy(x => new {
        x.Id,
        x.DocNumber,
        x.DocStatus,
        x.Title,
        x.SubmittedDate,
        x.CreatedBy,
        x.ApprovedByStep,
        x.RoutedFor
    }).Select(x => new
    {
        x.Key.Id,
        x.Key.DocNumber,
        x.Key.DocStatus,
        x.Key.Title,
        x.Key.SubmittedDate,
        x.Key.CreatedBy,
        x.Key.ApprovedByStep,
        x.Key.RoutedFor,
        splHistApprovedBy = string.Join(",", x.Where(i => i.splHistApprovedBy != null).Select(i => i.splHistApprovedBy).Distinct())
    }).ToList();

1 Ответ

0 голосов
/ 08 мая 2019

По предложению @Dale Burelle

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

CREATE NONCLUSTERED INDEX [<TransacList, sysname,>]
ON [dbo].[Histories] ([DocType])
INCLUDE ([RequestId],[ApprovedBy])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...