SQL 서버 데이터베이스에서 장기 실행 저장 프로 시저가 있습니다. 10 분마다 한 번 이상 실행하는 것을 원하지 않습니다.저장 프로 시저 내부에서 잠금을 설정하려면 어떻게해야합니까?
일단 저장 프로 시저가 실행되면 시간에 대해 LatestResult
테이블에 최신 결과를 저장하고 프로 시저에 대한 모든 호출에서 다음 10 분 동안 결과를 반환해야합니다.
그 정도는 비교적 간단하지만 절차에서 LatestResult
테이블을 확인하고 업데이트하므로 두 사용자가 동시에 프로 시저를 호출 할 때 큰 사용자베이스에 여러 가지 교착 상태가 발생하는 것으로 나타났습니다.
클라이언트 측/스레딩 상황에서는 먼저 잠금을 사용하여 첫 번째 사용자가 함수를 잠그면 두 번째 사용자가 잠금을 만나고 결과를 기다리고 첫 번째 사용자가 프로 시저 호출을 완료하고, LatestResult
테이블을 업데이트하고 두 번째 사용자의 잠금을 해제 한 다음 두 번째 사용자는 LatestResult
테이블에서 결과를 가져옵니다.
SQL Server에서 이러한 종류의 잠금을 수행 할 수있는 방법이 있습니까?
편집 : 내가 찾은
DECLARE @LastChecked AS DATETIME
DECLARE @LastResult AS NUMERIC(18,2)
SELECT TOP 1 @LastChecked = LastRunTime, @LastResult = LastResult FROM LastResult
DECLARE @ReturnValue AS NUMERIC(18,2)
IF DATEDIFF(n, @LastChecked, GetDate()) >= 10 OR NOT @LastResult = 0
BEGIN
SELECT @ReturnValue = ABS(ISNULL(SUM(ISNULL(Amount,0)),0)) FROM Transactions WHERE ISNULL(DeletedFlag,0) = 0 GROUP BY GroupID ORDER BY ABS(ISNULL(SUM(ISNULL(Amount,0)),0))
UPDATE LastResult SET LastRunTime = GETDATE(), LastResult = @ReturnValue
SELECT @ReturnValue
END
ELSE
BEGIN
SELECT @LastResult
END
나는 그룹에 무슨 일이 일어나고 있는지 정말 모르겠어요,하지만 :이
이 기본적으로 코드의 오류 검사 호출하지 않고 모습입니다 실행 시간이 약 4 초가되는 테스트 시스템. 나는이 기록의 일부를 보관하고 아마 사초 테이블에서 수백만 개의 행이 있다고 주어진 일을 도움이됩니다, 실행 합계로 졸이다 예정 어떤 일이 있다고 생각
...
이것은 느린 실행 저장 프로 시저를 다루는 정교한 계획처럼 보입니다.SP 최적화에 얼마나 많은 노력을 기울였습니까? – DMason
기본적으로 열의 값 대부분에 대해 SUM()을 실행하지만 큰 열이므로 매우 자주 값이 필요합니다. 개인적으로 저는 SUM()이라고 부르지 만 아마도 어색하고 교착 상태를 야기하지 않는 이유 때문에 이전 직원이 프로 시저를 넣었을 것입니다. 그것은 큰 정당성은 아니지만, 슬프게도 내가 가진 전부입니다. – Frosty840
일부 tsql 코드를 게시 할 수 있습니까? – DMason