이 기본적으로 running total 문제입니다.
편집 :
내 원래의 주장은 그 커서 기반의 솔루션이 실제로 가장 좋은 수행하는 몇 안되는 장소 중 하나입니다. 삼각형 자체 조인 솔루션의 문제점은 다음 단계의 하위 계산과 동일한 누적 체크섬을 반복적으로 다시 계산해야하므로 필요한 작업이 행 수와 함께 기하 급수적으로 늘어남에 따라 확장 성이 떨어집니다.
Corina의 대답은 "기발한 업데이트"접근 방식을 사용합니다. 체크섬을 적용하도록 조정했고 테스트에서 커서 솔루션에 대해 26 초가 아닌 3 초가 걸렸습니다. 둘 다 같은 결과를 냈다. 그러나 불행하게도 업데이트 동작의 문서화되지 않은 측면에 의존합니다. 프로덕션 코드에서 이것을 사용할지 결정하기 전에 반드시 here 토론을 읽어야합니다.
테스트 할 시간이 없었던 here (CLR 사용)으로 설명 된 세 번째 가능성이 있습니다. 그러나 the discussion here부터는 표시 할 때 누적 합계 유형을 계산할 수 있지만 계산 결과를 저장해야하는 경우 커서로 수행 할 수있는 좋은 방법 인 것 같습니다.
CREATE TABLE TestTable
(
PK int identity(1,1) primary key clustered,
[Name] varchar(50),
[CheckSum] AS CHECKSUM([Name]),
RollingCheckSum1 int NULL,
RollingCheckSum2 int NULL
)
/*Insert some random records (753,571 on my machine)*/
INSERT INTO TestTable ([Name])
SELECT newid() FROM sys.objects s1, sys.objects s2, sys.objects s3
접근 한 다음 Jeff Moden 제
DECLARE @RCS int
UPDATE TestTable
SET @RCS = RollingCheckSum1 =
CASE WHEN @RCS IS NULL THEN
[CheckSum]
ELSE
CHECKSUM([CheckSum]^@RCS)
END
FROM TestTable WITH (TABLOCKX)
OPTION (MAXDOP 1)
접근 방식 두 가지를 바탕으로 - 그 기사에 대한 토론 휴고 Kornelis 옹호자와 같은 커서 옵션을 사용하여.
SET NOCOUNT ON
BEGIN TRAN
DECLARE @RCS2 INT
DECLARE @PK INT, @CheckSum INT
DECLARE curRollingCheckSum CURSOR LOCAL STATIC READ_ONLY
FOR
SELECT PK, [CheckSum]
FROM TestTable
ORDER BY PK
OPEN curRollingCheckSum
FETCH NEXT FROM curRollingCheckSum
INTO @PK, @CheckSum
WHILE @@FETCH_STATUS = 0
BEGIN
SET @RCS2 = CASE WHEN @RCS2 IS NULL THEN @CheckSum ELSE CHECKSUM(@CheckSum^@RCS2) END
UPDATE dbo.TestTable
SET RollingCheckSum2 = @RCS2
WHERE @PK = PK
FETCH NEXT FROM curRollingCheckSum
INTO @PK, @CheckSum
END
COMMIT
테스트 그들은 같은
SELECT * FROM TestTable
WHERE RollingCheckSum1<> RollingCheckSum2
당신이 당신의 테이블에 클러스터 된 인덱스가 있는가하고 클러스터 된 인덱스 당신이 당신의 롤링 체크섬을 계산하기 위해 허용되는 순서의 순서가 있습니까? –
예, 예. 시간 기반 시퀀스 (bigint, 타임 스탬프 생각)가 있고 클러스터 된 인덱스입니다. – esac