Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
Всем привет!
Ситуация следующая: есть ПО, есть БД.
ПО жутко тормозит. Используя отчеты MSSQL выяснил (я не спец по MSSQL) что следующий запрос очень часто выполняется (примерно 90% от всех других запросов) и загружает на 100% процессор. Вот сам запрос (в начале я добавил переменные выдернутые из профайлера):
declare @p0 int,@p1 int,@p2 int,@p3 int,@p4 int;

set @p0=0;
set @p1=0;
set @p2=0;
set @p3=2923;
set @p4=2923;

SELECT DISTINCT [t8].[inId] AS [LinkId], [t8].[stName] AS [LinkName], [t8].[stInverseName] AS [LinkInverseName], [t8].[Id], 
       [t8].[IdMain], [t8].[Name], [t8].[Product], [t8].[Type], [t8].[State], [t8].[Version], [t8].[Created], [t8].[Revision], [t8].[Modified], 
       [t8].[blocker] AS [Blocker], [t8].[AccessLevel], [t8].[value] AS [CreatorId], [t8].[value2] AS [State2], [t8].[value3] AS [Modified2], 
       [t8].[value4] AS [MaxQuantity], [t8].[value5] AS [MinQuantity]
FROM (
    SELECT [t1].[inId], [t3].[stName], [t3].[stInverseName], [t0].[Id], [t0].[IdMain], [t0].[Name], [t0].[Product], [t0].[Type], 
               [t0].[State], [t0].[Version], [t0].[Created], [t0].[Revision], [t0].[Modified], [t0].[blocker], [t0].[AccessLevel], 
        (CASE 
            WHEN [t0].[IdOwner] IS NOT NULL THEN [t0].[IdOwner]
            ELSE @p1
         END) AS [value], 
        (CASE 
            WHEN [t1].[State] IS NULL THEN @p2
            ELSE [t1].[State]
         END) AS [value2], [t1].[dtModified] AS [value3], 
        (CASE 
            WHEN [t7].[test] IS NOT NULL THEN [t7].[inMaxQuantity]
            ELSE [t1].[inMaxQuantity]
         END) AS [value4], 
        (CASE 
            WHEN [t7].[test] IS NOT NULL THEN [t7].[inMinQuantity]
            ELSE [t1].[inMinQuantity]
         END) AS [value5], [t1].[inIdChild]
    FROM [dbo].[DFversions] AS [t0]
    INNER JOIN [dbo].[stLinks] AS [t1] ON [t0].[Id] = [t1].[inIdParent]
    INNER JOIN [dbo].[rlTypesAndTypes] AS [t2] ON [t1].[inIdTypeRel] = [t2].[inId]
    INNER JOIN [dbo].[dsLinkTypes] AS [t3] ON [t2].[inIdLinkType] = [t3].[inId]
    LEFT OUTER JOIN (
        SELECT 1 AS [test], [t4].[inId], [t4].[inMaxQuantity], [t4].[inMinQuantity], [t6].[inIdLock]
        FROM [dbo].[edtLinks] AS [t4]
        INNER JOIN [dbo].[stLinks] AS [t5] ON [t5].[inId] = [t4].[inId]
        LEFT OUTER JOIN [dbo].[stChanges] AS [t6] ON [t6].[inId] = [t5].[State]
        ) AS [t7] ON ([t1].[inId] = [t7].[inId]) AND (@p0 = [t7].[inIdLock])
    ) AS [t8]
WHERE ([t8].[inIdChild] = @p3) AND (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[stLinks] AS [t9]
    WHERE ([t9].[inIdParent] = [t8].[Id]) AND ([t9].[inIdChild] = @p4)
    ))

PS. Используется MS SQL 2008 Server

Заранее спасибо за советы.
27 сен 11, 08:57    [11339178]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Показывайте план.
27 сен 11, 09:19    [11339251]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Linq-to-SQL? Выкиньте.
Ну и да, план показывайте 8-)
27 сен 11, 09:46    [11339379]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
aleks2
Guest
Нафег тут план? И так видно - ацтой.

1.
DISTINCT [t8]...
У вас группировка соединения 7-и таблиц. Могет быть там СЕМЬ таблиц не нада для группировки то?

2.
(EXISTS(
    SELECT *
    FROM [dbo].[stLinks] AS [t9]
    WHERE ([t9].[inIdParent] = [t8].[Id]) AND ([t9].[inIdChild] = @p4)
    ))
Коррелированный подзапрос, в общем случае, хуже чем JOIN.
27 сен 11, 09:54    [11339414]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
Ray D
Linq-to-SQL? Выкиньте.

Что простите выкинте?

Ray D
Ну и да, план показывайте 8-)


План сам большой получился, поэтому прикладываю его в файле.

К сообщению приложен файл (plan.zip - 37Kb) cкачать
27 сен 11, 10:00    [11339447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
aleks2
Нафег тут план? И так видно - ацтой.

1.
DISTINCT [t8]...
У вас группировка соединения 7-и таблиц. Могет быть там СЕМЬ таблиц не нада для группировки то?

2.
(EXISTS(
    SELECT *
    FROM [dbo].[stLinks] AS [t9]
    WHERE ([t9].[inIdParent] = [t8].[Id]) AND ([t9].[inIdChild] = @p4)
    ))
Коррелированный подзапрос, в общем случае, хуже чем JOIN.


И что посоветуете?
27 сен 11, 10:03    [11339463]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
noob123123
Ray D
Linq-to-SQL? Выкиньте.

Что простите выкинте?

Ray D
Ну и да, план показывайте 8-)


План сам большой получился, поэтому прикладываю его в файле.

Ну очень похоже на запросы, которые Linq-to-sql (fffuuuu) генерит.
И планы лучше в xml выкладывайте (правую кнопку на плане, save че-то там)
27 сен 11, 10:10    [11339492]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
Ray D
Ну очень похоже на запросы, которые Linq-to-sql (fffuuuu) генерит.

Да, скорее всего, ПО написано на .Net

Ray D
И планы лучше в xml выкладывайте (правую кнопку на плане, save че-то там)

Выкладываю в xml

К сообщению приложен файл (Execution plan.zip - 53Kb) cкачать
27 сен 11, 10:21    [11339555]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
aleks2
Нафег тут план? И так видно - ацтой.

1.
DISTINCT [t8]...
У вас группировка соединения 7-и таблиц. Могет быть там СЕМЬ таблиц не нада для группировки то?

2.
(EXISTS(
    SELECT *
    FROM [dbo].[stLinks] AS [t9]
    WHERE ([t9].[inIdParent] = [t8].[Id]) AND ([t9].[inIdChild] = @p4)
    ))
Коррелированный подзапрос, в общем случае, хуже чем JOIN.

Подозреваю, что автор не сможет сильно влиять на запрос...
27 сен 11, 10:23    [11339569]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
noob123123
Ray D
Ну очень похоже на запросы, которые Linq-to-sql (fffuuuu) генерит.

Да, скорее всего, ПО написано на .Net


Отлично, исходниками располагаете?
27 сен 11, 11:03    [11339927]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
SamMan
Отлично, исходниками располагаете?


Нет, но возможность влиять на разработчиков есть.
Сейчас сложилась такая ситуация, что они (разработчики) говорят, что все хорошо работает (у них) и нам нужно поменять железо (стоит старенький сервер 2007 года). Но хочется доказать, что дело не в железе, а в ПО.
27 сен 11, 11:14    [11340021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
noob123123
Нет, но возможность влиять на разработчиков есть.


Разработчики пишут на каком языке? Они по T-SQL-ному шпрехают?
27 сен 11, 11:29    [11340144]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
aleks2
Guest
SamMan
noob123123
Нет, но возможность влиять на разработчиков есть.


Разработчики пишут на каком языке? Они по T-SQL-ному шпрехают?


Вряд ли. А то не писали б

        (CASE 
            WHEN [t0].[IdOwner] IS NOT NULL THEN [t0].[IdOwner]
            ELSE @p1
         END) AS [value], 
вместо
ISNULL([t0].[IdOwner], @p1)
27 сен 11, 11:32    [11340177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SamMan
noob123123
Нет, но возможность влиять на разработчиков есть.


Разработчики пишут на каком языке? Они по T-SQL-ному шпрехают?
Да видно, что никто не шпрехает, C# программисты писали.
noob123123
Сейчас сложилась такая ситуация, что они (разработчики) говорят, что все хорошо работает (у них) и нам нужно поменять железо (стоит старенький сервер 2007 года). Но хочется доказать, что дело не в железе, а в ПО.
Ну вот и показываете трейс из провайлера, говорите, что этот запрос занимает 90% времени процессора.

По моему, тут всё очевидно - и модель данных с архитектурой плохие (см. комментарий aleks2), ну и просто по обычной логике - не должен рядовой запрос занимать столько. Это же не вставка огромных данных в базу и не годовой отчёт.
noob123123
говорят, что все хорошо работает (у них)
У них тоже этот запрос выполняется так же часто? И тоже занимает 90% времени процессора?

Если ответ на олюбой вопрос нет - значит, виноваты.
noob123123
нам нужно поменять железо (стоит старенький сервер 2007 года)
Важен всё таки не столько год выпуска, сколько параметры сервера. И пользователей сколько - 1, 100, 10 000 ? Функциональность - простой сайтик или супернаворочанная ERP?
27 сен 11, 12:17    [11340706]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
alexeyvg
У них тоже этот запрос выполняется так же часто? И тоже занимает 90% времени процессора?

Скорее всего они на это не обращали внимание

alexeyvg
Важен всё таки не столько год выпуска, сколько параметры сервера. И пользователей сколько - 1, 100, 10 000 ? Функциональность - простой сайтик или супернаворочанная ERP?


Сервер DL360, 2 Х Intel Xeon 2,44 GHz, 3 GB
Пользователей ~100
Система документооборота

По поводу показывать трейс, то они говорят (примерное цитирование): "не хватает оперативной памяти, чтобы захешировалась база данных, поэтому так загружен процессор". Я в шоке.

PS. Сейчас все общение с разработчиками ведется через начальство которое далеко (и с нашей и я думаю с их стороны) от технических деталей. Поэтому хочется на небольшой примере доказать(показать), что дело не в железе.
27 сен 11, 13:19    [11341304]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
noob123123
По поводу показывать трейс, то они говорят (примерное цитирование): "не хватает оперативной памяти, чтобы захешировалась база данных, поэтому так загружен процессор".
Если прям так и говорят, то
27 сен 11, 13:21    [11341321]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
noob123123
По поводу показывать трейс, то они говорят (примерное цитирование): "не хватает оперативной памяти, чтобы захешировалась база данных, поэтому так загружен процессор". Я в шоке.
Ну вот и доказательство. Очевидно, загруженность процессора свидетельствует о полном использоваинии хеша.

Соответственно, теперь нужнро понять, как заставить производителя исправить ошибку.

Если это заказное ПО, то нужно оставлять средства давления на исполнителя. Если таких нету - их нужно создать, например, платить за техподдержку.
Если тиражное ПО, грозить устраивать антирекламу...

noob123123
PS. Сейчас все общение с разработчиками ведется через начальство которое далеко (и с нашей и я думаю с их стороны) от технических деталей. Поэтому хочется на небольшой примере доказать(показать), что дело не в железе.
Ваше начальство должно верить своим техспециалистам или нанять других. Как же ещё???

Ну ещё они могут обратиться к экспертам на стороне с конкретно сформулированными вопросами.

Например, является-ли исполнение потока запросов с 100% загрузкой ЦП и отсутствием обращений к диску признаком недостатка памяти для кеширования.
27 сен 11, 13:41    [11341532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Покажите на всякий результат select @@version
27 сен 11, 13:43    [11341552]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
noob123123
Member

Откуда:
Сообщений: 7
Ray D
Покажите на всякий результат select @@version


Вот

MSSQL
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
27 сен 11, 13:50    [11341622]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
ооо. начните с установки SP2 + CU5
27 сен 11, 13:52    [11341633]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить