Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
т.к. инсерт все равно гвоздями прибит к лупам,
разницу во времени дает финальный селект.
ему пропишите option(recompile)
если про наборы параметров угадано,
т.е. они бывают настолько разные, что надо разные планы под разные наборы,
это вас сопасет
27 июл 16, 16:21    [19463244]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
o-o
кто-то уже насильно лупы прописал, интересно, зачем?
вот эти вот таблицы PATP_OrderData, PATP_OrderDataDay какого размера?

Зачем, не могу знать. Разрабатывалось это все несколько лет назад, так что концов сейчас уже не найти. PATP_OrderData - 60 000 записей, PATP_OrderDataDay - 300 000 записей. Индексы есть в той и в той таблице и не один. Я вообще

автор
затем, уже само название @Day_Num говорит о числе,
но это что-то строковое, это зачем?

Пока это опустим.

автор
правда как же это вы в студии умудряетесь быстро выполнять, не меняя текст процедуры?

Смотрите, я делаю так: вхожу приложение от имени уникального пользователя, чтобы ловить действия только одного пользователя, ставлю фильтр в профайлере по пользователю и т.д, запускаю трассировку, в приложении начинаю делать действие которое вызывает у меня торможение. Смотрю в профайлере, вижу, что оно (приложение) делает в этот момент PATP_GetOrderDataForBuffer 92, в студии делаю EXEC PATP_GetOrderDataForBuffer 92 - выполняется быстро, а в профайлере SQL:BatchCompleted - смотрю столблец Duration - полторы минуты. План запроса я беру там же, т.е при выполнении в студии EXEC PATP_GetOrderDataForBuffer 92, я нажимаю кнопку показывать актуальный план запроса.
Вот план из студии. В скриншот не влезает, на ргхост залил
27 июл 16, 22:01    [19464653]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
проверьте, есть ли индекс на PATP_OrderData по order_id и желательно с id, day_num в любом виде,
а на PATP_OrderDataDay по order_data_id тоже с id, day_num.
day_num вообще непонятно, из какой таблицы.
(это чтоб оправдать лупы)
-----
план выкладывайте аттачментом в виде .sqlplan,
можно зазипить, хотя вроде он и так полезет
кажется, все отлавливаете правильно и параметр передаете тот же, пока идей нет, план давайте
28 июл 16, 00:05    [19465132]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Еще можете прямо профайлером актуальный план словить. Только аккуратно
28 июл 16, 01:16    [19465260]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
автор
проверьте, есть ли индекс на PATP_OrderData по order_id и желательно с id, day_num в любом виде,
а на PATP_OrderDataDay по order_data_id тоже с id, day_num.

В таблице OrderData присутствуют такие индексы:
-не уникальный не кластерный, по personnel_id
-не уникальный не кластерный, по mList_id
-не уникальный не кластерный, по [trans_id], INCLUDE сделан [mList_id], [personnel_id], [order_id]
-не уникальный не кластерный, по order_id
-кластерный индекс по id, который является PK.

В PATP_OrderDataDay очень долго перечислять, по id там кластерный индекс, по order_data_id четыре, по нескольким столбцам, среди которые order_data_id имеется. По day_num тоже есть.

Mike_za, я пробовал, но получаю странный результат. Выбираю в профайлере событие Showplan XML, но он почему то накидывает много-много мелких планов, я не могу понять какой мне именно нужен. Кстати у меня есть трассировка того момента, когда все было хорошо, я ее могу залить куда то, если она нужна. Событие Showplan XML там есть.

План из ssms прикрепил.

К сообщению приложен файл (actual plan ssms.zip - 9Kb) cкачать
28 июл 16, 09:33    [19465637]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
Ondayl,

1. Выполните скрипт:
use MyDB;

declare @s varchar(max);

select
 @s = a.x.value('.', 'varchar(max)')
from
 (
  select
   'dbcc freeproccache(' + convert(varchar(128), plan_handle, 1) + '); '
  from
   sys.dm_exec_procedure_stats
  where
   database_id = db_id() and object_id = object_id('[dbo].[PATP_GetOrderDataForBuffer]', 'P')
  for xml path(''), type
 ) a(x);

exec(@s);

2. Выполните процедуру из приложения и из студии с одинаковым значениями параметров.

3. Покажите результат выполнения (без последнего столбца):
use MyDB;

select
 ps.execution_count, ps.total_worker_time, ps.total_elapsed_time, ps.total_logical_reads, a.x.value('.', 'varchar(max)'), qp.query_plan
from
 sys.dm_exec_procedure_stats ps cross apply
 (
  select
   attribute + ' = ' + cast(value as varchar(max)) + '; '
  from
   sys.dm_exec_plan_attributes(ps.plan_handle)
  where
   is_cache_key = 1
  for xml path(''), type
 ) a(x) cross apply
 sys.dm_exec_query_plan(ps.plan_handle) qp
where
 ps.database_id = db_id() and ps.object_id = object_id('[dbo].[PATP_GetOrderDataForBuffer]', 'P');

Планы покажите отдельно в формате sqlplan.
28 июл 16, 13:00    [19467025]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
invm, вот заметил, у меня setoptions различаются и date_first. Про setoptions я читал в статье, что мне тут выше кинули, но так и не понял что означают эти set_options = 266491 и set_options = 262395. В справке смотрю, там как то по другому.

К сообщению приложен файл (выполнение.xls - 20Kb) cкачать
28 июл 16, 13:53    [19467477]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
invm, и планы.

К сообщению приложен файл (plans.zip - 21Kb) cкачать
28 июл 16, 13:54    [19467485]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
прикольно, да?
планы идентичные, хотя и понятно, почему 2,
как всегда, set options.
различие именно в ARITHABORT,
266491 это где он ON, 262395 где OFF
но чтений и правда больше.
может, внутри фуккций разгадка?
28 июл 16, 14:31    [19467774]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
можно текст функции fnGetAccUserId?
28 июл 16, 14:37    [19467829]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
вы точно под тем же юзером выполняете в студии?
просто или это ваше приложение насильно выставляет us_english/date_first = 7,
или если юзеры разные, то у того, что из приложения, язык логина инглиш,
а у вас нет.
не дай бог в функции какие-то даты.
с такими разными языковыми настройками даже при одинаковых параметрах можно совершенно разные даты лопатить.
и спасибо, если на выходе одно и то же (сомневаюсь)
28 июл 16, 14:43    [19467876]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
sti
Member

Откуда:
Сообщений: 769
o-o
и спасибо, если на выходе одно и то же (сомневаюсь)

Да всё как бы намекает, что у него разные результаты из приложения и из SSMS. Я об этом в самом начале написал.

2 Ondayl
Удостоверьтесь сначала, что вы из SSMS действительно запускаете в точности тоже самое, что и приложение и что результат совпадает. Вот если оно так, то тогда можно уже планы анализировать.
28 июл 16, 15:34    [19468313]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
o-o,

автор
вы точно под тем же юзером выполняете в студии?

Вот тут то я и облажался. Пользователи разные. В студии вообще "Windows аутентификация" стояла. Зашел в студию пользователем, что в приложении - выполняется так же медленно. Сохранил план. Только вот сейчас стало и из приложения нормально выполняться, это что, плохой план закешировался ? И второе, а где я должен на юзере этот язык переключить ? В "Язык по умолчанию" ?
28 июл 16, 15:53    [19468460]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
sti
o-o
и спасибо, если на выходе одно и то же (сомневаюсь)

Да всё как бы намекает, что у него разные результаты из приложения и из SSMS. Я об этом в самом начале написал.

2 Ondayl
Удостоверьтесь сначала, что вы из SSMS действительно запускаете в точности тоже самое, что и приложение и что результат совпадает. Вот если оно так, то тогда можно уже планы анализировать.

вы намекали на то, что может заливка идет или еще что,
короче, меняется число строк в самих участвующих таблицах.
но как-то больно однобоко меняется, при запросе из студии строки уплывают,
из приложения подливаются, причем никогда не происходит наоборот.
это еще более фантастично звучит.
а вот если кто-то где-то в функции накосячил и работает с датами как со строками,
то при неизменном числе строк в таблицах и при одних и тех же параметрах можно получить разное.
ну или даже одно и то же, но при этом обработать разное число строк
---
я голосую за то, что он выполняет под разными логинами.
из студии под админским, из приложения не знаю под кем.
но язык логинов разный
28 июл 16, 15:54    [19468465]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
Ondayl
где я должен на юзере этот язык переключить ? В "Язык по умолчанию" ?

сперва посмотрите, у кого какой
select name, default_language_name
from sys.server_principals
where name in (...)

потом на нужный язык поменяйте
alter login ... with default_language = language
28 июл 16, 15:59    [19468508]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
у него поди даже не в дате дело,
а какое-нибудь построчное ограничение на данные,
кто что может видеть.
разные логины разное же и видят, вот затем там и стоит интересная функция,
потому же он нам ее не показывает
28 июл 16, 16:03    [19468558]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
sti
Member

Откуда:
Сообщений: 769
o-o
у него поди даже не в дате дело,
а какое-нибудь построчное ограничение на данные,
кто что может видеть.
разные логины разное же и видят, вот затем там и стоит интересная функция,
потому же он нам ее не показывает

Очень возможно. Да множество вариантов можно придумать, тыкая польцем в небо. Например, приложение первым шагом что-то в таблицы пишет, вторым шагом эта процедура, третьим - удаление или изменение :-)
28 июл 16, 16:31    [19468747]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
да это же даже в плане написано.
все вьюхи у него это джойн соответствующей таблицы
и функции-ограничителя.
как раз по ид, возвращаемым функцией.
и при выполнении запроса под учеткой ТС эта функция вообще ничего не выдает,
так что ТС из вьюх извлекает 0 строк (см. актуальный план из студии)
все.
разгадано.
welcome to row level security
28 июл 16, 16:38    [19468819]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Вот функция, что просили, я ее текст ни в коем случае не скрываю. Если он еще интересен. В образовательных целях, я хотел бы чтобы вы пояснили ряд непонятных мне моментов:
1) Почему после того как я выполнил в студии эту процедуру от пользователя, что в приложении, у меня в приложении от всех пользователей все починилось и стало все быстро. Закешировался план ? Или что произошло ?
2) Наблюдаю странное, зашел в студию под пользователем usr01 (который у меня де-факто основной), так он вообще ни одной таблицы не видит. Хотя юзеры работают под этим пользователем в ПО успешно, ну кроме той проблемы с торможением процедуры.
3) Как все таки профайлером отловить актуальный план выполнения ? Почему мне накидывает много-много маленьких планов ? Наверное я должен использовать какое то другое событие, вместо Showplan XML.

Огромное спасибо за помощь, и за внимание!
+


ALTER function [dbo].[fnGetAccUserId]
(
@UserId          int,
@Scope           varchar(128),
@TabName         varchar(128),
@EntityId        int,
@ShowEdit        tinyint,
@ShowLevel      tinyint
)
returns @Result table (Id int not null primary key,
  Access tinyint not null check(Access in (0,1)))
as
begin

  declare
    @ScoTabId         int,
    @Access           tinyint,
    @IsStrict         tinyint

  set @ShowEdit = isnull(@ShowEdit,0)
  set @ScoTabId = dbo.fnScoTabIdByNames(@Scope,@TabName)
  if @ScoTabId is not null and @UserId is not null
  begin
    if dbo.fnIsUserSysAdmin(@UserId) = 1
    begin

      if isnull(@ShowLevel,1) = 1
        insert into @Result
          select Id, 1
          from  dbo.fnSelectTableId(@TabName,@EntityId)

    end else
    begin
      insert into @Result
        select EntityId,
          case
            when @ShowEdit = 0 then
              ReadGrant
            else
              EditGrant
          end
        from tbGrantEntity
        where
          GranteeId = @UserId and
          IsUser = 1 and
          ScoTabId = @ScoTabId and
          (
            @EntityId is null or
            EntityId = @EntityId
          ) and
          (
            (@ShowLevel is null and
              case
                when @ShowEdit = 0 then
                  ReadGrant
                else
                  EditGrant
              end is not null
            )
            or
            (@ShowLevel is not null and
              case
                when @ShowEdit = 0 then
                  ReadGrant
                else
                  EditGrant
              end = @ShowLevel
            )
          )
      set @Access =
      (
        select
          case
            when @ShowEdit = 0 then
              ReadGrant
            else
              EditGrant
          end
        from tbGrantTable
        where
          GranteeId = @UserId and
          IsUser = 1 and
          ScoTabId = @ScoTabId
      )

      if @Access is not null
      begin

        if @ShowLevel is null
          insert into @Result
            select a.Id,@Access
            from dbo.fnSelectTableId(@TabName,@EntityId)     a
            left join @Result                                b on a.Id = b.Id
            where
              b.Id is null

        else if @ShowLevel = @Access
          insert into @Result
            select a.Id,@Access
            from dbo.fnSelectTableId(@TabName,@EntityId)     a
            left join @Result                                b on a.Id = b.Id
            left join
            (
              select EntityId
              from tbGrantEntity
              where
                GranteeId = @UserId and
                IsUser = 1 and
                ScoTabId = @ScoTabId and
                (
                  @EntityId is null or
                  EntityId = @EntityId
                ) and
                case
                  when @ShowEdit = 0 then
                    ReadGrant
                  else
                    EditGrant
                end = case when @Access = 0 then 1 else 0 end
            )                                                c on a.Id = c.EntityId
            where
              b.Id is null and
              c.EntityId is null

      end else 
        insert into @Result
          select a.EntityId,a.A
          from
          (
            select a.EntityId,
              max(
                case
                  when @ShowEdit = 0 then
                    a.ReadGrant
                  else
                    a.EditGrant
                end
              ) as A
            from tbGrantEntity               a
            join sys_UserProfiles            b on a.GranteeId = b.profile_id
            where
              b.user_id = @UserId and
              a.IsUser = 0 and
              a.ScoTabId = @ScoTabId and
              (
                @EntityId is null or
                a.EntityId = @EntityId
              )
            group by
              a.EntityId
            having
              (@ShowLevel is null and
                max(
                  case
                    when @ShowEdit = 0 then
                      a.ReadGrant
                    else
                      a.EditGrant
                  end
                ) is not null
              ) or
              (@ShowLevel is not null and
                max(
                  case
                    when @ShowEdit = 0 then
                      a.ReadGrant
                    else
                      a.EditGrant
                  end
                ) = @ShowLevel
              )
          )                                                a
          left join @Result                                b on a.EntityId = b.Id
          where
            b.Id is null

        set @Access =
          (
            select
              max(
                case
                  when @ShowEdit = 0 then
                    a.ReadGrant
                  else
                    a.EditGrant
                end
              )
            from tbGrantTable                a
            join sys_UserProfiles            b on a.GranteeId = b.profile_id
            where
              b.user_id = @UserId and
              a.IsUser = 0 and
              a.ScoTabId = @ScoTabId
          )

        if @Access is null
        begin
          set @IsStrict = dbo.fnGetStrictAccess()

          if @IsStrict not in (0,1)
            set @IsStrict = 0

          if @IsStrict = 1
            set @Access = 0
          else
            set @Access = 1

        end

        if @ShowLevel is null

          insert into @Result
            select a.Id,@Access
            from dbo.fnSelectTableId(@TabName,@EntityId)     a
            left join @Result                                b on a.Id = b.Id
            where
              b.Id is null

        else if @ShowLevel = @Access
          insert into @Result
            select a.Id,@Access
            from dbo.fnSelectTableId(@TabName,@EntityId)     a
            left join @Result                                b on a.Id = b.Id
            left join
            (
              select EntityId
              from tbGrantEntity
              where
                GranteeId = @UserId and
                IsUser = 1 and
                ScoTabId = @ScoTabId and
                (
                  @EntityId is null or
                  EntityId = @EntityId
                ) and
                case
                  when @ShowEdit = 0 then
                    ReadGrant
                  else
                    EditGrant
                end = case when @Access = 0 then 1 else 0 end
            )                                                c on a.Id = c.EntityId
            left join
            (
              select a.EntityId
              from tbGrantEntity                     a
              join sys_UserProfiles                  b on a.GranteeId = b.profile_id
              left join
              (
                select EntityId
                from tbGrantEntity
                where
                  GranteeId = @UserId and
                  IsUser = 1 and
                  ScoTabId = @ScoTabId and
                  (
                    @EntityId is null or
                    EntityId = @EntityId
                  ) and
                  case
                    when @ShowEdit = 0 then
                      ReadGrant
                    else
                      EditGrant
                  end = case when @Access = 0 then 0 else 1 end
              )                                      c on a.EntityId = c.EntityId
              where
                b.user_id = @UserId and
                a.IsUser = 0 and
                a.ScoTabId = @ScoTabId and
                (
                  @EntityId is null or
                  a.EntityId = @EntityId
                ) and
                c.EntityId is null
              group by
                a.EntityId
              having
                max(
                  case
                    when @ShowEdit = 0 then
                      a.ReadGrant
                    else
                      a.EditGrant
                  end
                ) = case when @Access = 0 then 1 else 0 end
            )                                                d on a.Id = d.EntityId
            where
              b.Id is null and
              c.EntityId is null and
              d.EntityId is null

      end 
    end 
  end else 
    if isnull(@ShowLevel,0) = 0
      insert into @Result
        select Id, 0
        from  dbo.fnSelectTableId(@TabName,@EntityId)

  return
end

29 июл 16, 08:39    [19470758]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
sti
o-o
и спасибо, если на выходе одно и то же (сомневаюсь)

Да всё как бы намекает, что у него разные результаты из приложения и из SSMS. Я об этом в самом начале написал.

2 Ondayl
Удостоверьтесь сначала, что вы из SSMS действительно запускаете в точности тоже самое, что и приложение и что результат совпадает. Вот если оно так, то тогда можно уже планы анализировать.

Так результат выполнения по строкам то совпадал, вот в чем дело.
29 июл 16, 08:40    [19470763]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
sti
Member

Откуда:
Сообщений: 769
Ondayl
Вот функция, что просили, я ее текст ни в коем случае не скрываю. Если он еще интересен. В образовательных целях, я хотел бы чтобы вы пояснили ряд непонятных мне моментов:
1) Почему после того как я выполнил в студии эту процедуру от пользователя, что в приложении, у меня в приложении от всех пользователей все починилось и стало все быстро. Закешировался план ? Или что произошло ?
2) Наблюдаю странное, зашел в студию под пользователем usr01 (который у меня де-факто основной), так он вообще ни одной таблицы не видит. Хотя юзеры работают под этим пользователем в ПО успешно, ну кроме той проблемы с торможением процедуры.
3) Как все таки профайлером отловить актуальный план выполнения ? Почему мне накидывает много-много маленьких планов ? Наверное я должен использовать какое то другое событие, вместо Showplan XML.

Ваша функция вызывает ещё пачку других функций. Мой персональный совет - разберитесь сами, что там у вас происходит и что делает эта ваша процедура. Многое станет ясно и проблемное место найдёте. Явное row level security.

1) Да, вероятно план закешировался.
2) Юзер может не иметь прав на просмотр таблиц. Ему достаточно прав на выполнение процедуры. Вы вообще в какой там у себя должности? Посмотрите на права пользователя и всё поймёте.
3) Так у вас море мелких запросов, куча if-ов. Вот и получаете много планов.

Ondayl
Так результат выполнения по строкам то совпадал, вот в чем дело.

Как вы это определили? В целом да, возможно. Напрмер, если от одного пользователя выполняется какой-то if, который жрёт много ресурсов, но по факту не влияет на результат.
29 июл 16, 09:20    [19470866]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
Ondayl
Так результат выполнения по строкам то совпадал, вот в чем дело.

по строкам это как, просто число строк?
а что часть колонок была NULL, не заметили?
все вьюхи там цепляются через LEFT JOIN,
и именно в них скрыта информация не для всех.
так вот вам ни одна вьюха не вернула ни строчки,
а тому юзеру еще как, оттуда и разное число чтений.
а число строк конечно совпадает, был бы пустой результат, если б был INNER JOIN
хотя бы с одной из вьюх.
----
мне вообще странно, что что-то поменялось после выполнения из студии
"от пользователя, что в приложении".
я в вашей процедуре вижу проблему, которую не истправить никаким "заходом в студию".
оптимизатор оценивает функцию, возвращающую нужные ид, в 1 строку.
всегда, без разницы, под кем выполняется.
ну и разумеется для каждого джойна с одной строкой выбирается NESTED LOOS.
но на самом деле юзерам отдается гораздо больше строк из функции
и наверняка там нужен MERGE JOIN со вьюхами
----
можно взглянуть на актуальный план под правильным юзером?
интересно, сколько строк отдает каждая вьюха
29 июл 16, 12:25    [19471956]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
o-o
Guest
если б мне дали такое переписать, то мои действия:
0) создать копию этой процедуры с новым именем
1) табличную переменную заменить на временную таблицу, луповы хинты убрать
2) всем вьюхам насильный LEFT MERGE JOIN
(там же у всех базовых таблиц ПК по ид, функция тоже отдает с ПК по ид)
29 июл 16, 12:45    [19472090]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Здравствуйте!

[quot sti]
Ondayl
Мой персональный совет - разберитесь сами, что там у вас происходит и что делает эта ваша процедура. Многое станет ясно и проблемное место найдёте. Явное row level security.
.

Совет то конечно хороший, но времени нужно много будет.

автор
по строкам это как, просто число строк?
а что часть колонок была NULL, не заметили?
все вьюхи там цепляются через LEFT JOIN,
и именно в них скрыта информация не для всех.
так вот вам ни одна вьюха не вернула ни строчки,
а тому юзеру еще как, оттуда и разное число чтений.
а число строк конечно совпадает, был бы пустой результат, если б был INNER JOIN
хотя бы с одной из вьюх.

Увы нет, не заметил.
автор
мне вообще странно, что что-то поменялось после выполнения из студии
"от пользователя, что в приложении".

Мне вдвойне странно. Теперь ситуация в точности наоборот. В студии медленно, в приложении быстро. Пользователи одинаковы
автор
я в вашей процедуре вижу проблему, которую не истправить никаким "заходом в студию"

Ну я не только зашел, я еще эту процедуру там выполнил.
автор
можно взглянуть на актуальный план под правильным юзером?
интересно, сколько строк отдает каждая вьюха

Прикрепил два плана. Первый, это когда я залогинился под верным юзером, когда я писал, что отработка идет так же медленно, как и в приложении. Второй, это который после того как стало в приложении быстро. Игрался с ARITHABORT, но разницы не увидел (или я и не должен видеть?).

К сообщению приложен файл (plans2.zip - 21Kb) cкачать
1 авг 16, 10:08    [19480512]     Ответить | Цитировать Сообщить модератору
 Re: Возрастает чтение на одной и той же операции в дневное время суток.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Ondayl,

Добрый день.

У вас в двух планах разная кардинальность базовых таблиц, но одинаковые БД, схемы и таблицы, что наводит на мысль: либо данные активно изменяются, либо планы с разных серверов. Сервер точно один и тот же?

Второй момент, такое сильное отличие в планах обусловлено оценкой табличной переменной, в первом случае это 1 строка, во втором, это 19811. По умолчанию, если не предпринимать никаких действий, оценка одна строка. Есть два способа обойти поведение по умолчанию, первый, это добавить в конец запроса подсказку OPTION(RECOMPILE). Но, судя по тексту запроса, у вас ни там, ни там этой подсказки не указано.

Второй вариант, это Trace Flag 2453 (https://support.microsoft.com/en-us/kb/2952444). Про то, с какими TF оптимизирован запрос, сказать из плана нельзя, только если TF он явно не указан в тексте запроса.

Поэтому, посмотрите, может быть у вас приложение включает/отключает какие-то флаги при выполнении запросов? Или может быть у вас есть logon trigger-а и какое-то такое решение https://blogs.msdn.microsoft.com/psssql/2015/12/30/wanting-your-non-sysadmin-users-to-enable-certain-trace-flags-without-changing-your-app/. Либо, все-таки, разные сервера. Может быть еще что-то. В любом случае, я бы начал изучение странности именно с того, почему табличная переменная в двух планах оценена по-разному.
1 авг 16, 11:05    [19480856]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить