Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как узнать SPID процесса, создавшего временную таблицу?  [new]
Шредер
Guest
Собственно, subj.
2 апр 02, 08:11    [24855]     Ответить | Цитировать Сообщить модератору
 RE:Как узнать SPID процесса, создавшего временную таблицу?  [new]
Александр+Спелицин
Guest
Временные таблицы доступны только из той сессии, из которой они были созданы. Поэтому правильный ответ - id текущей сессии.
Т.е.:
Select @@spid
4 апр 02, 19:51    [24856]     Ответить | Цитировать Сообщить модератору
 RE:Как узнать SPID процесса, создавшего временную таблицу?  [new]
Snake
Guest
To Александр+Спелицин
Временные таблицы доступны только из той сессии, из которой они были созданы.
Вот тут вы батенька не правы...
Есть еще такие временные таблицы - ##<table_name>
Вопрос очевидно по ним!
5 апр 02, 05:40    [24857]     Ответить | Цитировать Сообщить модератору
 RE:Как узнать SPID процесса, создавшего временную таблицу?  [new]
alexeyvg
Guest
Не знаю, что нужно "Шредер", а вот мне нужно было узнать, кто создал локальную врем. таблицу.
Например, в tempdb..sysobjects я вижу:
name id
#mytable________________000000004BC1 894946889
#mytable________________000000004CE2 839481277
Кто их создал? Точно знаю, что не мой процесс.
5 апр 02, 08:46    [24858]     Ответить | Цитировать Сообщить модератору
 RE:Как узнать SPID процесса, создавшего временную таблицу?  [new]
nic_ii
Guest
У меня несколько раз было такое, что после завершения процесса временные таблицы оставались неудаленными. То ли процедура завершалась некорректно, то ли баг какой в семерке... однако после перезагрузки сервера они исчезали. Если же породивший таблицу процесс еще не умер то его номер "можно" узнать через Enterprise manager - идешь в Management->CurrentActivity->Locks/Objects и смотришь tempdb там все процессы, которые ее держат (при большой нагрузке на сервер и активном использовании временных таблиц это тебе ничего не даст так как нет информации об именах залокированных таблиц )
10 апр 02, 11:57    [24859]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
Подскажите, ничего с апреля 2002г. не изменилось по сабжевому вопросу ? :)

т.е. ситуация такая, как описывает alexeyvg тут 24858 :
- в списке временных таблиц есть таблица
name id
#mytable________________000000004BC1 894946889

Нужно узнать SPID процесса, который её создал и "прибить" его.
Есть такая возможность ?
15 авг 18, 10:25    [21642626]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
court, Dude, who owns that #temp table?
15 авг 18, 10:52    [21642651]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
buser,

Спасибо !
Похоже, это оно, но что-то не очень пока получаеться ...

Сервер 2008R2.
Пробовал первые два скрипта (те которые "In SQL Server 2005, 2008 and 2008 R2, you should be able to pull this information from the default trace"), - оба валятся с ошибкой

Msg 568, Level 16, State 23, Line 8
Encountered an error or an unexpected end of trace file 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\Log_1827.trc'.

Файл этот (Log_1827.trc) - есть. Профайлером открываеться ...
15 авг 18, 11:51    [21642772]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
invm
Member

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

Как вариант, можно поискать в кеше планы, обращающиеся к искомой таблице. В атрибутах такого плана будет содержаться spid, для которого он был скомпилирован.
Искать примерно так:
declare @name sysname = N'#mytabe';

with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select distinct
 pa.value as session_id
from
 (select quotename(@name)) o(name) cross apply
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_query_plan(cp.plan_handle) qp cross apply
 (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa
where
 qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")]') = 1 and
 pa.value <> 0;
Естественно, в результате может быть много мусора, или вообще результата не будет.
Но, по крайней мере, можно попробовать.

Задача упрощается если на таблице есть индекс, а еще лучше кластерный индекс. Тогда можно найти только живые временные таблицы:
with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select distinct
 pa.value as session_id
from
 (select quotename(@name)) o(name) cross apply
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_query_plan(cp.plan_handle) qp cross apply
 (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa cross apply
 (select qp.query_plan.query('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]').value('(*/@Index)[1]', 'sysname')) i(name)
where
 qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]') = 1 and
 pa.value <> 0 and
 exists(select 1 from tempdb.sys.sysindexes where quotename(name) = i.name);
15 авг 18, 12:41    [21642878]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5226
court
Файл этот (Log_1827.trc) - есть. Профайлером открываеться ...
15 авг 18, 12:46    [21642891]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5226
komrad
court
Файл этот (Log_1827.trc) - есть. Профайлером открываеться ...

отложите его в сторону и снова попробуйте запрос
там еще 4 файла на диске

если открывается профайлером, то поищите в профайлере
15 авг 18, 12:48    [21642894]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
Поправка:
with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select distinct
 pa.value as session_id
from
 (select quotename(@name)) o(name) cross apply
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_query_plan(cp.plan_handle) qp cross apply
 (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa cross apply
 (select qp.query_plan.query('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]').value('(*/@Index)[1]', 'sysname')) i(name)
where
 qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]') = 1 and
 pa.value <> 0 and
 exists(select 1 from tempdb.sys.indexes where quotename(name) = i.name and object_name(object_id, db_id('tempdb')) like @name + N'[_]%');
15 авг 18, 12:50    [21642897]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
invm
Поправка:
with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select distinct
 pa.value as session_id
from
 (select quotename(@name)) o(name) cross apply
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_query_plan(cp.plan_handle) qp cross apply
 (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa cross apply
 (select qp.query_plan.query('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]').value('(*/@Index)[1]', 'sysname')) i(name)
where
 qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]') = 1 and
 pa.value <> 0 and
 exists(select 1 from tempdb.sys.indexes where quotename(name) = i.name and object_name(object_id, db_id('tempdb')) like @name + N'[_]%');

invm,

пустой результат ...

Проверил и на боевом 2008R2, где и "зависла" времянка.
А затем на своём тестовом 2017-ом : в одном окне запроса SSMS создал времянку, вставил несколько записей и сделал SELECT из неё,
и не закрывая первого окна, в другом выполнил этот запрос, - пусто в обоих случаях
15 авг 18, 14:46    [21643192]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
court,

если нет плана в кеше то и не будет нифига. Вообще глобальный смысл искать "зависщую" временную таблицы стремится к нулю.
15 авг 18, 14:50    [21643203]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
TaPaK
court,

если нет плана в кеше то и не будет нифига. Вообще глобальный смысл искать "зависщую" временную таблицы стремится к нулю.
Смысл могу объяснить:
- эта табличка - "флажок" который создаётся при запуске одной ХП, и держится установленным, пока эта ХП не отработает.
Всё это для того, что бы ХП нельзя было запустить второй раз, до окончания выполнения запущенной первой
  -- Проверяем наличие врем.таб-флажка. Если таблица есть, то "на выход". Если нет - создаём.
  if exists (select 1 from tempdb..sysobjects where name like '#Flag%')	
  begin
	-- "Флажок" - есть, ХП УЖЕ выполняется, - на выход
    	RAISERROR ('!', 16, 1)
	return 0	
  end

Вот сейчас получается такая ситуация, что "стартануть" ХП нельзя
(т.е. проблему пока решил по другому, просто переименовав в ХП этот флажок на #Flag1, но суть вопроса осталась.)

Вообще, можно как-то "чужую времянку" удалить, кроме как "убить" породивший её коннект или рестартануть сервер ?
15 авг 18, 15:06    [21643243]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
автор
Всё это для того, что бы ХП нельзя было запустить второй раз, до окончания выполнения запущенной первой
Откройте для себя sp_getapplock, хорош изобретать велосипеды без колес.
15 авг 18, 15:09    [21643252]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
автор
Всё это для того, что бы ХП нельзя было запустить второй раз, до окончания выполнения запущенной первой
Откройте для себя sp_getapplock, хорош изобретать велосипеды без колес.
\
а они всё велосипеды изобретают
15 авг 18, 15:10    [21643254]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
buser
court, Dude, who owns that #temp table?

с 2012+ default не пишет создание временных таблиц. Единсвенное, что ловить создание индекса на такой таблице. Но это всё костыли
15 авг 18, 15:41    [21643303]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TaPaK
buser
court, Dude, who owns that #temp table?

с 2012+ default не пишет создание временных таблиц. Единсвенное, что ловить создание индекса на такой таблице. Но это всё костыли

ох, там так и написано :)
варинат c EE очендь даже жизненный, но это до проблемы :)
15 авг 18, 15:48    [21643312]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
Гавриленко Сергей Алексеевич
автор
Всё это для того, что бы ХП нельзя было запустить второй раз, до окончания выполнения запущенной первой
Откройте для себя sp_getapplock, хорош изобретать велосипеды без колес.
нуу, велик вполне нормальный, давно ездит :)

-----------------------------------------------------------------------------
Хорошо, а на вопрос, "в каком коннекте было установлено вот это вот всё":
DECLARE @result int;
EXEC @result=sp_getapplock 
	@Resource = 'test1'
	,@LockMode = 'Exclusive'
	,@LockOwner = 'Session'
	,@LockTimeout = 0; 

ответ будет проще чем с "флажком" ?
Так что бы "по быстрому" я его не нашел ...
15 авг 18, 16:09    [21643338]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
court
Гавриленко Сергей Алексеевич
пропущено...
Откройте для себя sp_getapplock, хорош изобретать велосипеды без колес.
нуу, велик вполне нормальный, давно ездит :)

-----------------------------------------------------------------------------
Хорошо, а на вопрос, "в каком коннекте было установлено вот это вот всё":
DECLARE @result int;
EXEC @result=sp_getapplock 
	@Resource = 'test1'
	,@LockMode = 'Exclusive'
	,@LockOwner = 'Session'
	,@LockTimeout = 0; 

ответ будет проще чем с "флажком" ?
Так что бы "по быстрому" я его не нашел ...

автор
DECLARE @Code VARCRAH(255) = 'test1'
SELECT TOP 1 request_session_Id
FROM
sys.dm_tran_locks a
WHERE
a.resource_type = 'APPLICATION' AND
a.Request_Owner_Type = 'SESSION' AND
a.resource_description LIKE '%' + @Code + '%'
15 авг 18, 16:13    [21643347]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
court
Member

Откуда:
Сообщений: 1985
TaPaK
court
пропущено...
нуу, велик вполне нормальный, давно ездит :)

-----------------------------------------------------------------------------
Хорошо, а на вопрос, "в каком коннекте было установлено вот это вот всё":
DECLARE @result int;
EXEC @result=sp_getapplock 
	@Resource = 'test1'
	,@LockMode = 'Exclusive'
	,@LockOwner = 'Session'
	,@LockTimeout = 0; 


ответ будет проще чем с "флажком" ?
Так что бы "по быстрому" я его не нашел ...

автор
DECLARE @Code VARCRAH(255) = 'test1'
SELECT TOP 1 request_session_Id
FROM
sys.dm_tran_locks a
WHERE
a.resource_type = 'APPLICATION' AND
a.Request_Owner_Type = 'SESSION' AND
a.resource_description LIKE '%' + @Code + '%'
Спасибо.

тут 10510723 ещё вариант нашёл
15 авг 18, 16:20    [21643360]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
court
TaPaK
пропущено...

пропущено...
Спасибо.

тут 10510723 ещё вариант нашёл

та тоже самое, только dmv больше для людей :)
15 авг 18, 16:25    [21643369]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
DECLARE @Code VARCRAH(255) = 'test1'
SELECT TOP 1 request_session_Id
FROM
sys.dm_tran_locks a
WHERE
a.resource_type = 'APPLICATION' AND
a.Request_Owner_Type = 'SESSION' AND
a.resource_description LIKE '%' + @Code + '%'
Если длина @Code превысит 32, то работать не будет.
15 авг 18, 16:35    [21643381]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать SPID процесса, создавшего временную таблицу?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
invm
DECLARE @Code VARCRAH(255) = 'test1'
SELECT TOP 1 request_session_Id
FROM
sys.dm_tran_locks a
WHERE
a.resource_type = 'APPLICATION' AND
a.Request_Owner_Type = 'SESSION' AND
a.resource_description LIKE '%' + @Code + '%'
Если длина @Code превысит 32, то работать не будет.

так не создавайте
15 авг 18, 16:37    [21643385]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить