시스템 버전 임시 테이블을 사용할 때 (SQL Server 2016의 새로운 기능)이 기능을 사용하여 대규모 관계형 데이터웨어 하우스에서 느리게 변경되는 차원을 처리 할 때 쿼리 제작 및 성능에 어떤 영향을 미칩니 까?
예를 들어 열이 10 만 행 이고 외래 키 열이 수십억 행인 팩트 테이블이 있다고 가정 Customer
합니다 . 그리고 "고객의 우편 번호 별 총 2014 년 판매량"을 쿼리하려고한다고 가정하십시오. 단순화 된 DDL은 다음과 같습니다 (명확성을 위해 많은 열을 생략 함).Postal Code
Sales
CustomerID
CREATE TABLE Customer
(
CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED,
PostalCode varchar(50) NOT NULL,
SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON);
CREATE TABLE Sale
(
SaleId int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED,
SaleDateTime datetime2 NOT NULL,
CustomerId int NOT NULL FOREIGN KEY REFERENCES Customer(CustomerID),
SaleAmount decimal(10,2) NOT NULL
);
흥미로운 점은 고객이 1 년 동안 이사했을 수 있으므로 동일한 고객이 다른 우편 번호를 가질 수 있다는 것입니다. 또한 고객이 멀리 이동했다가 다시 이동할 수도 있습니다. 즉, 동일한 우편 번호로 동일한 고객에 대해 여러 이력 기록이있을 수 있습니다. "우편 번호 별 판매"에 대한 나의 쿼리는 고객의 우편 번호가 시간이 지남에 따라 어떻게 변하는 지에 관계없이 정확한 결과를 계산할 수 있어야합니다.
임시 테이블을 사용하여 고객 차원 만 쿼리하는 방법을 이해 SELECT * FROM Customer FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
하지만 (예 :) 팩트 테이블에 가장 정확하고 효율적으로 조인하는 방법을 모르겠습니다.
이것이 내가 어떻게 쿼리해야합니까?
SELECT c.PostalCode, sum(s.SaleAmount) SaleAmount
FROM Customer c FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
JOIN Sale s ON s.CustomerId = c.CustomerId
WHERE s.SaleDateTime >= '2014-1-1' AND s.SaleDateTime < '2015-1-1'
AND c.SysStartTime >= s.SaleDateTime
AND c.SysEndTime < s.SaleDateTime
GROUP BY c.PostalCode
그리고 이와 같은 쿼리를 할 때주의해야 할 성능 고려 사항은 무엇입니까?