SQL Server 테이블에서 최신 가격을 효율적으로 검색하는 방법

데이터베이스 관리 분야에서 많은 개발자들이 직면하는 일반적인 문제 중 하나는 방대한 역사적 데이터를 보유한 테이블에서 다양한 제품이나 항목의 최신 가격을 추출하는 것입니다. SQL Server를 사용 중이라면, 특히 2005 버전에서 다양한 가격 업데이트가 포함된 테이블에서 최신 가격을 얻는 것은 데이터 세트가 클 경우 다소 daunting할 수 있습니다. 이 블로그 포스트에서는 결과 집합의 불필요한 팽창 없이 특정 항목 그룹에 대한 고유한 최신 가격을 얻기 위해 효율적인 SQL 쿼리를 작성하는 방법을 알아보겠습니다.

문제 이해하기

다음은 우리의 테이블 구조입니다:

ID uniqueidentifier not null,
ThingID int NOT NULL,
PriceDateTime datetime NOT NULL,
Price decimal(18,4) NOT NULL

매일 각 “thing”에 대한 수백 개의 레코드가 있을 수 있어 최신 가격 업데이트를 위한 데이터를 선별하는 것이 번거로울 수 있습니다. 예를 들어 다음과 같은 쿼리를 실행하면:

SELECT * 
FROM Thing
WHERE ThingID IN (1,2,3,4,5,6)
  AND PriceDate > cast( convert(varchar(20), getdate(), 106) as DateTime) 

이 쿼리는 현재 날짜의 지정된 ThingID에 대한 모든 가격 레코드를 반환하지만, 필요 이상으로 수백 개의 행을 얻을 수 있습니다. 원하는 것은 각 ThingID에 대해 하나의 레코드(가장 최근의 가격)를 검색하는 것입니다. 그렇다면 이를 최적으로 달성할 수 있는 방법은 무엇일까요?

솔루션: 서브쿼리 활용하기

오늘의 최신 가격을 가져오되 결과를 혼잡하게 만들지 않기 위해 권장되는 접근 방식은 서브쿼리를 사용하는 것입니다. 다음과 같이 효과적으로 수행할 수 있습니다:

SQL 쿼리 예시

SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID) 
              FROM Thing 
              WHERE ThingID IN (1,2,3,4) 
              GROUP BY ThingID)

이 쿼리에서는 GROUP BY와 **MAX(ID)**를 결합하여 각 ThingID에 대한 최신 항목을 가져오는 것을 보장합니다. 여기서 가정하는 것은 높은 ID가 더 최신의 가격을 의미한다는 것으로, 이는 많은 데이터베이스 디자인에서 일반적인 관례입니다.

IsCurrent 열로 성능 향상하기

위의 쿼리는 효과적이지만, 더 큰 데이터 세트의 경우 IsCurrent라는 열을 포함하는 것이 좋습니다. 이 열은 가격이 최신인지(1이면 그렇고, 0이면 그렇지 않음)를 나타냅니다. 다음은 이 접근 방식을 사용하여 간소화된 쿼리를 구성하는 방법입니다:

SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
  AND IsCurrent = 1

이 간단한 쿼리는 서브쿼리의 오버헤드 없이 최신 가격을 신속하게 필터링합니다. 그러나 IsCurrent 플래그와 함께 사용할 경우 이전 또는 잘못된 데이터의 위험이 증가하므로 데이터 일관성을 유지하는 것이 중요합니다.

고유 식별자 처리하기

ID가 uniqueidentifier(GUID)인 경우 추가 복잡성이 발생합니다. 다음은 해당 구조에 맞게 쿼리를 조정하는 방법입니다:

SELECT T.* 
FROM Thing T
JOIN (SELECT ThingID, max(PriceDateTime) AS LatestPriceDate
      FROM Thing 
      WHERE ThingID IN (1,2,3,4)
      GROUP BY ThingID) X 
ON X.ThingID = T.ThingID 
  AND X.LatestPriceDate = T.PriceDateTime
WHERE ThingID IN (1,2,3,4)

이 업데이트된 쿼리는 각 ThingID 그룹에 대한 가장 최근 가격 날짜를 설명하는 서브쿼리와 원래 테이블을 조인하여 최신 가격을 효율적으로 검색합니다.

결론

SQL Server에서 방대한 역사적 데이터를 가진 테이블에서 최신 가격을 검색하는 것은 성능 함정을 피하기 위해 신중한 쿼리 구조화가 필요합니다. 서브쿼리를 활용하고 IsCurrent 열의 구현을 고려함으로써 가격 데이터를 보다 간소화하고 효율적으로 관리할 수 있는 접근 방식을 달성할 수 있습니다.

간단히 몇 개의 항목에 대한 레코드를 가져오든지, 방대한 데이터 세트를 다루고 있든지 간에, 이 가이드는 번거로움 없이 최신 가격을 가져오는 데 도움이 될 것입니다. 쿼리 즐기세요!