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

Откуда: Минск
Сообщений: 1867
Добрый день.
Есть запрос:
         INSERT INTO #tmpSalesInvoiceHeader
  	  (Number, TypeBusinessTransaction)
  	  SELECT DISTINCT
  	    tmp.Number,
  	    sih.[Sales Process Type Code]
  	  FROM
  	    #tmpSalesInvoiceLine AS tmp
  	    JOIN navdb.[Sales Invoice Header] AS sih WITH(NOLOCK)
  	      ON sih.No_ = tmp.Number COLLATE Cyrillic_General_CI_AS

Если выполняется из-под моей учетки, то все ок.
Если из под учетки sql-agent то нет.
Мы оба sysadmin на удаленном сервере.
navdb.[Sales Invoice Header] - таблица на удаленном сервере.
В моем понимание она должна 1 раз целиком затянуться и потом происходить соединение.
Под моей учеткой так и происходит, а под агентом нет.
Приложил план из профайлера снятый для случая когда идет работа из-под агента.
Видно что на Remote Query Он выполнялся 22 раза!!!! 22 раза затягивал все таблицу. Потому что на вход пришло 22 строки из времянки.

Я сравнил полностью пошаговый план из-под своей учетки и из-под агента. Нашел разницу вот такую:
Удаленный запрос генерирует из-под моей учетки:
declare @p1 int
set @p1=0
exec sp_prepexec @p1 output,NULL,N'SELECT "Tbl1006"."No_" "Col1010","Tbl1006"."Sales Process Type Code" "Col1033" FROM "shate-m-pod"."dbo"."Shate-M RU$Sales Invoice Header" "Tbl1006" WITH (NOLOCK)'
select @p1

А Из-под учетки агента:
declare @p1 int
set @p1=0
exec sp_prepexec @p1 output,NULL,N'SELECT "Tbl1006"."No_" "Col1041","Tbl1006"."Sales Process Type Code" "Col1064" FROM "shate-m-pod"."dbo"."Shate-M RU$Sales Invoice Header" "Tbl1006" WITH (NOLOCK) ORDER BY "Col1064" ASC'
select @p1
и так 22 раза
Разница только в ORDER BY "Col1064" ASC.... Откуда он взялся??? И при том в одной учетки его нет, а в другой есть?

К сообщению приложен файл (1.SQLPlan - 20Kb) cкачать
30 мар 17, 11:19    [20349971]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
o-o
Guest
че-то мне это напоминает, ORDER BY там, где не нужен
у меня был HASH JOIN с удаленной таблицей, а все равно на линкеде делался ORDER BY по колонкам соединения.
и это объяснялось так: кому лень накатывать сервис-паки (рабочий сервер 2008 R2 SP1),
тот огребает.
ибо на моем локальном 2008 R2 SP3 запрос к тому же линкеду никакой не лепил
sort & hash -- зачем сортировать в преддверии hash join?
30 мар 17, 11:28    [20350013]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Оба сервера:
Microsoft SQL Server 2014 (SP1-CU3) (KB3094221) - 12.0.4427.24 (X64)
И запрос он генерирует разный для разных учтеок.
Если я выполняю из под моей учтеки, то норм, без сортировки, а если из под учетки агента, то добавляет сортировку.
30 мар 17, 11:34    [20350048]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
X-Cite,
1. А что мешает "вручную" затянуть 1 раз во временную таблицу и построить индексы? И не надеяться на авось и чудо?
2. С такими задачами не сталкивался, но есть подозрение, что учетка агента не имеет доступа к системным таблицам - нет информации об индексах и сортировках, потому тянет всю таблицу под каждую запись.
30 мар 17, 11:39    [20350077]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Оба sysadmin на обоих серверах.
Я в чудеса не верю. На все можно найти объяснение вплоть до того, что какой-нибудь разработчик microsoft захардкодил if агент then slow
30 мар 17, 11:43    [20350102]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
X-Cite
и так 22 раза
А как иначе при NL? В случае не-агента у вас там не NL.

Разные планы могут получаться из-за существенной разницы в количестве строк в #tmpSalesInvoiceLine.
30 мар 17, 11:45    [20350113]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
o-o
Guest
Руслан Дамирович
есть подозрение, что учетка агента не имеет доступа к системным таблицам - нет информации об индексах и сортировках, потому тянет всю таблицу под каждую запись.

это о каких именно индексах и сортировках у него нет информации?
о своих временных таблицах есть.
о таблице с линкеда как нет, если ТС утверждает, что учетка агента там сисадмин?
и вообще, начиная с 2012 SP2, статистика на линкеде доступна и неадминам тоже
30 мар 17, 11:46    [20350124]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
X-Cite,
я тоже
потенциальный кандидат проблемы COLLATE Cyrillic_General_CI_AS
30 мар 17, 11:49    [20350147]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
invm
X-Cite
и так 22 раза
А как иначе при NL? В случае не-агента у вас там не NL.

Разные планы могут получаться из-за существенной разницы в количестве строк в #tmpSalesInvoiceLine.

Я протестировал оба выполнения на одних наборах данных, отличие только от учетной записи.
От себя выполнял 100 раз и от агента.
Во всех случаях у меня без сортировки, из-под агента, с сортировкой.
И как выяснилось, из под меня идет HM
А из под агента NL
В кэше нашел 2 плана и оба с HM

Указал для запроса хинт HM и о чудо, из-под учетки агента пошел HASH и пропал ORDER BY. Теперь осталось понять, почему он для другой учетной записи строил другой план.
30 мар 17, 12:21    [20350304]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
X-Cite
Теперь осталось понять, почему он для другой учетной записи строил другой план.
Для обоих планов сравниваете значения из sys.dm_exec_plan_attributes у которых is_cache_key = 1.
30 мар 17, 12:55    [20350473]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
komrad
Member

Откуда:
Сообщений: 5920
X-Cite
Указал для запроса хинт HM и о чудо, из-под учетки агента пошел HASH и пропал ORDER BY. Теперь осталось понять, почему он для другой учетной записи строил другой план.


session settings?
https://www.mssqltips.com/sqlservertip/1829/session-state-settings-for-cached-sql-server-query-plans/
30 мар 17, 13:24    [20350630]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
В кеше остался только один план. (я пересобрал ХП с hash join)
А так, единственный вариант, только если настройки сессии.
30 мар 17, 13:38    [20350721]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
o-o
Guest
X-Cite
В кеше остался только один план. (я пересобрал ХП с hash join)
А так, единственный вариант, только если настройки сессии.

так если были разные настройки сессий, то они же и остались.
теперь должны быть 2 одинаковых плана в связи с хинтом,
а у вас один. как же так?
30 мар 17, 13:43    [20350745]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Второй план был для моей учетки. После изменения ХП я не запускал ее от себя.
Сейчас я убрал хинт, обновил ХП. Из кеша соответственно планы исчезли.
Агент запустил - появился один план.
Я запустил, появился второй план.
Аттрибуты отличаются для set_options поэтому плана 2.
Оба плана с HASH MATCH но Учетка агента опять использует Nested Loop
30 мар 17, 13:48    [20350784]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
А нет, соврал. Уже Hash Match пошел, один раз только NL был судя по времени выполнения.
30 мар 17, 13:49    [20350793]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1867
Меня смущает только то, что до этого в кеше было два плана и оба Hash Match.
Судя по всему один мой и один агента. Однако агент упорно использовал Loop
30 мар 17, 13:57    [20350852]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
o-o
Guest
так сейчас-то уже не посмотрите,
надо было сразу смотреть в sys.dm_exec_procedure_stats.
там же есть last_execution_time.
вот запускаете под агентом и смотрите, вам показалось, что не этот план выполняется,
или так оно и есть
30 мар 17, 14:12    [20350931]     Ответить | Цитировать Сообщить модератору
 Re: linked server для разных учеток строит разные удаленные запросы  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
X-Cite
Оба плана с HASH MATCH но Учетка агента опять использует Nested Loop
Такого не бывает. Нашли не тот план, либо нужного уже нет в кеше.
30 мар 17, 14:54    [20351162]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить