혼자서 해결을 해보려 했으나 어느 부분부터 들여다 봐야 할 지 몰라서 이렇게 도움을 여쭤봅니다.
제가 EXEC sp1; EXEC sp2; EXEC sp3; 이렇게 실행을 하면 SP1, SP2, SP3 가 순차척으로 돌아가는데 저는 저 세 sp가 같은 시간에 실행 되도록 하고 싶어서 Stored procedure 이름들을 변수로 받아서 Parallel.ForEach를 사용하는 CRL 함수를 만들었습니다.
대략적으로 말하자면, 아래의 방식으로 CRL 함수를 불렀을때
EXEC SP_ParallelExecution @Server = '(local)'
@Database = 'DataBaseName',
@SPNames = 'SP1,SP2,SP3'
C# 코드는 아래의 식으로 돌아갑니다.
string conn = "Data source=" + (string)Server + ";initial Catalog=" + (string)Database + ";user id=id;password=pw";
Parallel.ForEach(SPs, item =>
{
string esql = "EXEC " + item;
SqlConnection con = new SqlConnection(conn);
con.Open();
SqlCommand cmd = new SqlCommand(esql, con);
cmd.ExecuteNonQuery();
cmd.Cancel();
cmd.Dispose();
con.Close();
con.Dispose();
}
문제는 제가 서버에서 직접 EXEC sp1; 이라고 실행했을때 1초밖에 안 걸리는 간단한 작은 쿼리도 이 CRL을 통해서 실행되면
CPU를 30% 점유하고 이 쿼리가 실행이 끝났음에도 CPU가 30%가 점유된 채로 유지가 됩니다. 현재 사용중인 SQL Server 버전은 2008 R2 입니다.
그리고 이 현상은 서버가 Window Server 2012일 경우에만 일어납니다. 이 똑같은 CRL을 같은 방식으로 Window Server 2008 R2에서 사용했을 경우에는 아무런 문제가 일어나지 않습니다.
저희가 Windows Server 2012를 산지 얼마 안되서 뭐가 세팅이 잘못되서 이러는건지 도저히 어디를 둘러봐야 할지 모르겠습니다.
Troubleshooting 하는 방법좀 가르쳐 주세요ㅠㅠ 그리고 혹시 이런 Parallel.ForEach 를 CLR로 만들지 않고 다른 방식으로 여러개의 sp를 동시에 실행시킬수 있는 방법을 아시는 분 있으면 추천 부탁 드립니다..
C# 코드와 어셈블리를 첨부합니다.
Comment 1
-
항해자™
2014.10.04 09:54
http://www.codeproject.com/Articles/29356/Asynchronous-T-SQL-Execution-Without-Service-Broke