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

Откуда:
Сообщений: 42
Всем привет! Помогите пожалуйста помочь. Работает группа операторов, есть много процессов, которые постоянно появляются при работе операторов и потом часть из них висит в памяти. В данный момент мы закрываем висячие процессы, а хотелось бы оставлять,например, 100, а остальные выгружать из памяти, чтобы не загружать сервер. Можно ли как то это реализовать?

Вот хранимая процедура:

USE [KO_db]
GO
/****** Object:  StoredProcedure [dbo].[g_process_control]    Script Date: 07/14/2011 16:08:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- мониторинг процессов
-- =============================================
ALTER PROCEDURE [dbo].[g_process_control]
	-- Add the parameters for the stored procedure here
	@p int =  NULL
AS
BEGIN
 -- Insert statements for procedure here
	 declare @proc int, @sql_handle  varbinary(20),
			@sql_text  nvarchar(4000),
			@stmt_start  int,
			@stmt_end  int, @spid_cur varchar(4), @cmdkill varchar(525)

	select @proc = count(*)
		from master..sysprocesses 
		  where len(hostname)>0		

	set @cmdkill = NULL	

	if(@proc>=30 and @p is null)	--- проверка более 30 процессов
	  begin

			declare cur cursor for SELECT CAST(P.spid AS VARCHAR(4)) 
									FROM master..sysprocesses P 
										where len(P.hostname)>0 
											ORDER BY P.loginame
			
			open cur
			  while 1 = 1 begin
 				fetch next from cur into @spid_cur
 				  if @@fetch_status <> 0 break

					/* обработка процессов */

					select  @sql_handle  = sql_handle,
						@stmt_start  = stmt_start,
						@stmt_end  = stmt_end
						  from  master..sysprocesses (nolock)
						  where  spid = @spid_cur
									

						  select  @sql_text = [text]
						  from  ::fn_get_sql(@sql_handle)

						  set @sql_text = convert(nvarchar(1000),@sql_text)	
							  if(@sql_text like '%exec g_new_application_sound_alert%')	
							     begin
								set @cmdkill = 'kill '+@spid_cur
								exec(@cmdkill)
								print 'процесс '+@spid_cur + '... '+@sql_text+' -  закрыт'
								 end

								  end
			close cur
			deallocate cur

	end
	
	/* показ процессов */
	print 'сейчас рабочих процессов - ' + cast(@proc as nvarchar(10))

END

Спасибо заранее, если сможете помочь!

Microsoft SQL Server Management Studio 10.50.1600.1
Windows Server 2008 Enterprise
14 июл 11, 16:15    [10974889]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка процессов, если их много, можно ли?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
потом часть из них висит в памяти


Что, простисте и где висит? Какой статус у таких процессов?

автор
а остальные выгружать из памяти, чтобы не загружать сервер


И чем висящий процесс "нагружает сервак"?
14 июл 11, 17:01    [10975287]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка процессов, если их много, можно ли?  [new]
mike909
Member

Откуда:
Сообщений: 662
pkarklin
автор
потом часть из них висит в памяти


Что, простисте и где висит? Какой статус у таких процессов?

автор
а остальные выгружать из памяти, чтобы не загружать сервер


И чем висящий процесс "нагружает сервак"?

if(@sql_text like '%exec g_new_application_sound_alert%')
Т.е. Операторы, которые ничего не делают - слушают музыку, транслируемую с SQL_я, нагружая последнего
14 июл 11, 17:23    [10975463]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка процессов, если их много, можно ли?  [new]
mike909
Member

Откуда:
Сообщений: 662
Sigizmund-8,

В качестве свободного бреда:
declare @Должно_остаться_в_живых int

set @Должно_остаться_в_живых = 1

;with Ваш_Страшный_Запрос( session_id, start_time ) as (
  select r.session_id, r.start_time
  from sys.dm_exec_requests as r
  cross apply sys.dm_exec_sql_text(r.sql_handle) as t
  WHERE t.[TEXT] like '%SELECT%' --< Не забудте поменять на Ваше страшное условие !!! >--
)
select *
from Ваш_Страшный_Запрос

except

select *
from (
  select top( @Должно_остаться_в_живых ) *
  from Ваш_Страшный_Запрос
  order by start_time desc
) as t
14 июл 11, 17:53    [10975641]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить