Bir kullanırken sistem sürümü belirlenmiş zamansal tablo (SQL Server 2016 yılında yeni), bu özellik büyük bir ilişkisel veri ambarında Boyutları değiştirme yavaşça işlemek için kullanılan sorgu yazma ve performans etkileri nelerdir?
Örneğin, Customer
bir Postal Code
sütun ile 100.000 satırlık bir boyutum ve yabancı anahtar sütunlu Sales
bir milyar dolarlık bir olgu tablosum olduğunu varsayalım CustomerID
. "Müşterinin posta koduna göre toplam 2014 satışını" sorgulamak istediğimi varsayalım. Basitleştirilmiş DDL şu şekildedir (açıklık için birçok sütunu atlayarak):
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
);
İlginç olan, müşterilerin yıl içinde hareket etmiş olmalarıdır, böylece aynı müşterinin farklı posta kodları olabilir. Ve bir müşterinin uzaklaşıp sonra geri taşınması bile uzaktan mümkündür, yani aynı müşteri için aynı posta koduna sahip birden fazla geçmiş kaydı olabilir! "Posta koduna göre satışlar" sorgum, müşterilerin posta kodlarının zaman içinde nasıl değiştiğinden bağımsız olarak doğru sonuçları hesaplayabilmelidir.
Geçici tabloları yalnızca müşteri boyutunu sorgulamak için nasıl kullanacağımı anlıyorum (örneğin SELECT * FROM Customer FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
), ancak olgu tablosuna en doğru ve verimli bir şekilde nasıl katılacağından emin değilim.
Sorgulamam bu mu?
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
Ve böyle sorgular yaparken dikkat etmem gereken performans faktörleri nelerdir?