> 데이터 베이스 > MySQL 튜토리얼 > SQL Server에서 총 실행 합계를 계산하는 가장 효율적인 방법은 무엇입니까?

SQL Server에서 총 실행 합계를 계산하는 가장 효율적인 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-25 03:32:08
원래의
865명이 탐색했습니다.

What's the Most Efficient Way to Calculate Running Totals in SQL Server?

SQL Server 누적 합계 계산 방법에 대한 자세한 설명

SQL 쿼리에서 누적 합계를 계산하는 것은 일반적인 요구 사항입니다. OVER 절은 Oracle 및 ANSI-SQL에서 이러한 계산을 수행하는 편리한 방법을 제공합니다. 그러나 SQL Server의 OVER 절 구현에는 특정 사용 사례를 처리할 수 있는 유연성이 부족합니다.

업데이트 팁

단점에도 불구하고 SQL Server에서 누적 합계를 계산하는 효과적인 기술은 집계 집합 문을 사용하는 것입니다. 이 방법에는 다음이 포함됩니다.

  1. 원본 테이블과 동일한 열로 임시 테이블을 만듭니다.
  2. 누적 합계 열을 NULL로 설정하면서 원본 테이블의 데이터를 임시 테이블에 삽입합니다.
  3. 이전 값을 기반으로 누적 합계를 계산하려면 임시 테이블을 업데이트하세요.

이 기술은 매우 효율적이지만 잠재적인 문제가 있습니다.

  • UPDATE 문이 행을 처리하는 순서는 날짜 순서와 항상 동일하지 않을 수도 있습니다.
  • 업데이트 트릭은 SQL Server의 문서화되지 않은 구현 세부 사항에 의존합니다.

벤치마크 비교

벤치마크 테스트에서는 SQL Server의 제약 조건 내에서 커서 방법이 누적 합계를 계산하는 가장 빠르고 안전한 방법임을 보여줍니다. 업데이트 트릭은 최고의 성능을 제공하지만 처리 순서에 잠재적인 문제가 있습니다. 따라서 프로덕션 코드의 경우 커서 기반 접근 방식을 사용하는 것이 좋습니다.

예제 코드 및 벤치마크 데이터

다음 코드는 벤치마킹을 위한 테스트 데이터와 함께 작업 예제를 제공합니다.

테스트 데이터 설정:

<code class="language-sql">CREATE TABLE #t (
    ord INT PRIMARY KEY,
    total INT,
    running_total INT
);

SET NOCOUNT ON;
DECLARE @i INT;
SET @i = 0;
BEGIN TRAN;
WHILE @i < 10000
BEGIN
    INSERT INTO #t (ord, total) VALUES (@i, ABS(CHECKSUM(NEWID()) % 1000));
    SET @i = @i + 1;
END;
COMMIT TRAN;</code>
로그인 후 복사

테스트 방법:

테스트 1: 상관 하위 쿼리

<code class="language-sql">SELECT ord,
       total,
       (SELECT SUM(total)
        FROM #t b
        WHERE b.ord <= a.ord) AS RunningTotal
FROM #t a
ORDER BY a.ord;</code>
로그인 후 복사

테스트 2: 교차 연결

<code class="language-sql">SELECT a.ord,
       a.total,
       SUM(b.total) AS RunningTotal
FROM #t a
CROSS JOIN #t b
WHERE b.ord <= a.ord
GROUP BY a.ord, a.total
ORDER BY a.ord;</code>
로그인 후 복사

테스트 3: 커서

<code class="language-sql">DECLARE @TotalTable TABLE (
    ord INT PRIMARY KEY,
    total INT,
    running_total INT
);

DECLARE forward_cursor CURSOR FAST_FORWARD
FOR
SELECT ord,
       total
FROM #t
ORDER BY ord;

OPEN forward_cursor;

DECLARE @running_total INT,
        @ord INT,
        @total INT;

SET @running_total = 0;

FETCH NEXT FROM forward_cursor
INTO @ord,
      @total;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @running_total = @running_total + @total;
    INSERT @TotalTable VALUES (@ord,
                              @total,
                              @running_total);
    FETCH NEXT FROM forward_cursor
    INTO @ord,
          @total;
END;

CLOSE forward_cursor;
DEALLOCATE forward_cursor;

SELECT *
FROM @TotalTable;</code>
로그인 후 복사

테스트 4: 업데이트 팁

<code class="language-sql">DECLARE @total INT;
SET @total = 0;
UPDATE #t
SET running_total = @total,
    @total = @total + total;

SELECT *
FROM #t;</code>
로그인 후 복사

위 네 가지 방법의 실행 효율성을 비교하면 SQL Server에서 누적합을 계산하는 모범 사례를 도출할 수 있습니다. 실제 성능은 데이터 양과 서버 구성에 따라 달라질 수 있습니다.

위 내용은 SQL Server에서 총 실행 합계를 계산하는 가장 효율적인 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿