Слишком длинная продолжительность запроса в SQL Server 2008 R2 DataCenter - PullRequest
0 голосов
/ 07 декабря 2010

У нас есть запрос, и это фактический план выполнения

alt text Как видите, поиск кластерного индекса занимает 99%. Также он ищет первичные ключи (введите int ).

Таблица Источник имеет 275 000 строк.
Таблица AuthorSource имеет 2 275 000 строк.

Разделение и сжатие не используются.

Проблема в том, что первое выполнение занимает 25-40 секунд. Но второй прогон подряд занимает 1-2 секунды.

Также у нас есть репликация, средство чтения очереди, агенты чтения журнала, работающие на этом сервере.
Объем оперативной памяти: 4 ГБ
Sql Server использует: 3,7 ГБ

Мы думаем, что sql кэширует запрос после первого выполнения в течение некоторого периода времени, и это причина того, что второй запуск занимает всего 1-2 секунды.

Но независимо от кеша и других причин очень странно, что запрос на поиск по первичному ключу занимает 20-40 секунд.

Эта проблема повторяется. Любые другие параметры мы предоставляем в запрос - мы получаем одинаковые результаты: очень длинный первый запрос и быстрый второй и следующий.

Может быть, нам нужны какие-то дополнительные настройки или возможность регулятора ресурсов?

        exec sp_executesql N'
SELECT [Project1].[C1] AS         [C1]
FROM   ( SELECT CAST(1 AS bit) AS X
       ) AS [SingleRowTable1]
       LEFT OUTER JOIN
              (SELECT [GroupBy1].[A1] AS                        [C1]
              FROM    ( SELECT COUNT(CAST(1 AS bit)) AS         [A1]
                      FROM    (SELECT [Extent1].[Mention_ID]                       AS [Mention_ID]                      ,
                                      [Extent1].[Theme_ID]                         AS [Theme_ID]                        ,
                                      [Extent1].[Mention_Weight]                   AS [Mention_Weight]                  ,
                                      [Extent1].[AuthorSource_ID]                  AS [AuthorSource_ID1]                ,
                                      [Extent1].[Mention_CreationDate]             AS [Mention_CreationDate]            ,
                                      [Extent1].[Mention_DeletedMark]              AS [Mention_DeletedMark]             ,
                                      [Extent1].[Mention_AuthorTags]               AS [Mention_AuthorTags]              ,
                                      [Extent1].[Mention_Tonality]                 AS [Mention_Tonality]                ,
                                      [Extent1].[Mention_Comment]                  AS [Mention_Comment]                 ,
                                      [Extent1].[Mention_AdditionDate]             AS [Mention_AdditionDate]            ,
                                      [Extent1].[UserToAnswer_ID]                  AS [UserToAnswer_ID]                 ,
                                      [Extent1].[GeoName_ID]                       AS [GeoName_ID]                      ,
                                      [Extent1].[Geo_ID]                           AS [Geo_ID]                          ,
                                      [Extent1].[Mention_PermaLinkHash]            AS [Mention_PermaLinkHash]           ,
                                      [Extent1].[Mention_IsFiltredByAuthor]        AS [Mention_IsFiltredByAuthor]       ,
                                      [Extent1].[Mention_IsFiltredByGeo]           AS [Mention_IsFiltredByGeo]          ,
                                      [Extent1].[Mention_IsFiltredBySource]        AS [Mention_IsFiltredBySource]       ,
                                      [Extent1].[Mention_IsFiltredBySourceType]    AS [Mention_IsFiltredBySourceType]   ,
                                      [Extent1].[GengineLog_InstanceId]            AS [GengineLog_InstanceId]           ,
                                      [Extent1].[Mention_PermaLinkBinaryHash]      AS [Mention_PermaLinkBinaryHash]     ,
                                      [Extent1].[Mention_APIType]                  AS [Mention_APIType]                 ,
                                      [Extent1].[Mention_IsFilteredByAuthorSource] AS [Mention_IsFilteredByAuthorSource],
                                      [Extent1].[Mention_IsFavorite]               AS [Mention_IsFavorite]              ,
                                      [Extent1].[Mention_SpamType]                 AS [Mention_SpamType]                ,
                                      [Extent1].[MentionContent_ID]                AS [MentionContent_ID]               ,
                                      [Extent2].[AuthorSource_ID]                  AS [AuthorSource_ID2]                ,
                                      [Extent2].[Author_ID]                        AS [Author_ID]                       ,
                                      [Extent2].[Source_ID]                        AS [Source_ID]                       ,
                                      [Extent2].[Author_Nick]                      AS [Author_Nick]                     ,
                                      [Extent2].[Author_UrlBinaryHash]             AS [Author_UrlBinaryHash]            ,
                                      [Extent2].[AuthorSource_Type]                AS [AuthorSource_Type]               ,
                                      [Extent2].[Author_Url]                       AS [Author_Url]                      ,
                                      [Extent2].[AuthorSource_Description]         AS [AuthorSource_Description]        ,
                                      [Extent2].[AuthorSource_Gender]              AS [AuthorSource_Gender]
                              FROM    [dbo].[Mention]                              AS [Extent1]
                                      LEFT OUTER JOIN [dbo].[AuthorSource]         AS [Extent2]
                                      ON      [Extent1].[AuthorSource_ID] = [Extent2].[AuthorSource_ID]
                              WHERE   (
                                              [Extent1].[Mention_DeletedMark] <> CAST(1 AS bit)
                                      )
                              AND
                                      (
                                              [Extent1].[Mention_IsFiltredByAuthor] <> CAST(1 AS bit)
                                      )
                              AND
                                      (
                                              [Extent1].[Mention_IsFilteredByAuthorSource] <> CAST(1 AS bit)
                                      )
                              AND
                                      (
                                              [Extent1].[Mention_IsFiltredByGeo] <> CAST(1 AS bit)
                                      )
                              AND
                                      (
                                              [Extent1].[Mention_IsFiltredBySource] <> CAST(1 AS bit)
                                      )
                              AND
                                      (
                                              [Extent1].[Mention_IsFiltredBySourceType] <> CAST(1 AS bit)
                                      )
                              )                              AS [Filter1]
                              LEFT OUTER JOIN [dbo].[Source] AS [Extent3]
                              ON      [Filter1].[Source_ID] = [Extent3].[Source_ID]
                      WHERE   (
                                      [Filter1].[Theme_ID] = @p__linq__49557
                              )
                      AND
                              (
                                      [Extent3].[Source_Type] <> @p__linq__49558
                              )
                      ) AS [GroupaBy1]
              ) AS [Project1]
       ON     1 = 1
',N'@p__linq__49557 int,@p__linq__49558 int',@p__linq__49557=7966,@p__linq__49558=8

Информация об эффективности поиска индекса

Также мы написали запрос вручную в sql с помощью этого простого кода:

        Select COUNT(1) from Mention m inner join AuthorSource auth on m.AuthorSource_ID = auth.AuthorSource_ID inner join
    Source s on auth.Source_ID = s.Source_ID where 
    m.Mention_DeletedMark = 0 AND m.Mention_IsFilteredByAuthorSource = 0 AND m.Mention_IsFiltredByAuthor = 0 
    AND m.Mention_IsFiltredByGeo = 0 AND m.Mention_IsFiltredBySource = 0 AND m.Mention_IsFiltredBySourceType = 0
    AND m.Theme_ID = 7966
    and s.Source_Type <> 8 

и план выполнения такой же, как и мы.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2010

После советов Мартина в комментариях к вопросу ответ заключается в понимании того, как SQL Server строит планы выполнения и подсчете операций чтения с диска, необходимых для первого выполнения запроса.

В нашей конкретной ситуации принудительное inner hash join вместо inner join дает нам ожидаемый результат и другой план выполнения, который SQL выбирает по умолчанию.

0 голосов
/ 07 декабря 2010

Запрос довольно сложный, но похоже, что вам не хватает индекса на Mention.Theme_ID?

Sql-сервер имеет проблемы, потому что используется много <>, что означает, что он не может использовать индекс и должен извлечь все, а затем отсортировать его.

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