Saat menggunakan tabel temporal versi sistem (baru di SQL Server 2016), apa yang dimaksud dengan authoring query dan implikasi kinerja ketika fitur ini digunakan untuk menangani Dimensi Perlahan-lahan Mengubah dalam gudang data relasional yang besar?
Misalnya, anggap saya memiliki Customer
dimensi 100.000 baris dengan Postal Code
kolom dan Sales
tabel fakta multi-miliar baris dengan CustomerID
kolom kunci asing. Dan anggap saya ingin meminta "Total penjualan 2014 berdasarkan kode pos pelanggan". DDL yang disederhanakan adalah seperti ini (menghilangkan banyak kolom untuk kejelasan):
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
);
Yang menarik adalah bahwa pelanggan mungkin telah pindah sepanjang tahun sehingga pelanggan yang sama mungkin memiliki kode pos yang berbeda. Dan bahkan sangat mungkin bahwa pelanggan pindah dan kemudian pindah kembali, artinya mungkin ada beberapa catatan riwayat untuk pelanggan yang sama dengan kode pos yang sama! Permintaan saya "penjualan dengan kode pos" harus dapat menghitung hasil yang benar terlepas dari bagaimana kode pos pelanggan berubah dari waktu ke waktu.
Saya mengerti bagaimana menggunakan tabel temporal untuk menanyakan dimensi pelanggan saja (mis. SELECT * FROM Customer FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
) Tapi saya tidak yakin bagaimana cara bergabung dengan tabel fakta secara paling akurat dan efisien.
Apakah ini bagaimana saya harus menanyakannya?
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
Dan apa pertimbangan kinerja yang harus saya perhatikan ketika membuat pertanyaan seperti ini?
sumber