Khi sử dụng bảng tạm thời được phiên bản hệ thống (mới trong SQL Server 2016), tác giả truy vấn và hiệu suất truy vấn khi tính năng này được sử dụng để xử lý Kích thước thay đổi chậm trong kho dữ liệu quan hệ lớn là gì?
Ví dụ: giả sử tôi có thứ Customer
nguyên 100.000 hàng với một Postal Code
cột và Sales
bảng thực tế nhiều tỷ với một CustomerID
cột khóa ngoại. Và giả sử tôi muốn truy vấn "Tổng doanh số 2014 bằng mã bưu chính của khách hàng". DDL được đơn giản hóa như thế này (bỏ qua nhiều cột cho rõ ràng):
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
);
Điều thú vị là khách hàng có thể đã chuyển đi trong năm để cùng một khách hàng có thể có các mã bưu chính khác nhau. Và thậm chí có thể từ xa rằng một khách hàng đã chuyển đi và sau đó di chuyển trở lại, có nghĩa là có thể có nhiều hồ sơ lịch sử cho cùng một khách hàng với cùng một mã bưu chính! Truy vấn của tôi về "bán hàng theo mã bưu chính" sẽ có thể tính toán kết quả chính xác bất kể mã bưu chính của khách hàng thay đổi theo thời gian như thế nào.
Tôi hiểu cách sử dụng các bảng tạm thời để truy vấn kích thước khách hàng một mình (ví dụ SELECT * FROM Customer FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
) nhưng tôi không chắc chắn làm thế nào để tham gia chính xác và hiệu quả nhất vào bảng thực tế.
Đây có phải là cách tôi nên truy vấn nó?
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
Và những cân nhắc về hiệu suất mà tôi nên đề phòng khi thực hiện các truy vấn như thế này là gì?