Chiến lược truy vấn bằng cách sử dụng các bảng tạm thời được phiên bản hệ thống SQL Server 2016 cho Kích thước thay đổi chậm


17

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ứ Customernguyên 100.000 hàng với một Postal Codecột và Salesbảng thực tế nhiều tỷ với một CustomerIDcộ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ì?

Câu trả lời:


1

Tôi nghĩ, trong trường hợp của bạn, một bảng dẫn xuất là cần thiết để cô lập số lượng truy vấn đột biến của mã bưu điện cho mỗi khách hàng:

SELECT c.postalcode 
, sum(s.SaleAmount) SaleAmount
, count(postcode_mutations.customerid) as CntCustomerChangedPostCode   
FROM dbo.Sale s
JOIN dbo.Customer c on s.customerid = c.customerid

LEFT JOIN (
SELECT 
    CustomerID
FROM [dbo].[Customer]
FOR SYSTEM_TIME FROM '20140101' TO '20150101'
GROUP BY CustomerID
HAVING COUNT(DISTINCT PostalCode) > 1
) postcode_mutations on s.customerid = postcode_mutations.customerid

WHERE s.SaleDateTime >= '2014-1-1' AND s.SaleDateTime < '2015-1-1'
GROUP BY c.PostalCode

cập nhật: Vì truy vấn được cho là phục vụ các kịch bản DWH / Analytics, nên lập chỉ mục cột là một tùy chọn để kiểm tra. Tôi cũng đã thực hiện một số điểm chuẩn trước đây cho bảng 10 triệu hàng.


Tại sao cần phải đếm số lượng thay đổi trên mỗi khách hàng? Các khách hàng thay đổi mã bưu chính trong năm sẽ tăng thêm độ phức tạp cho truy vấn, nhưng thực tế việc báo cáo về những thay đổi đó dường như không bắt buộc.
Justin Grant

@JustinGrant Số lượng thay đổi là để hiển thị cách các đột biến này có thể được truy xuất từ ​​dữ liệu lịch sử. Tuy nhiên, những dòng này, bạn đã thêm vào ngày hôm qua: 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. Yêu cầu rõ ràng hơn. Trong trường hợp đó, HỆ THỐNG nên được đặt theo cùng một cách cho cả hai bảng. và có hai cách: 1) Sử dụng các bảng bị tước và áp dụng system_time cho cả hai bảng. 2) Hoặc chỉ cần tạo chế độ xem giữ tham gia và áp dụng HỆ THỐNG HỆ THỐNG khi truy vấn chế độ xem
Alexandr Volok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.