Veri Ambarı Tasarımı: Birleşik Tarih ve Boyut ile Ayrı Gün ve Saat boyutları ve zaman dilimleri karşılaştırması


10

Yeni bir veri ambarı için tasarıma yeni başlıyoruz ve tarih ve saat boyutlarımızın nasıl çalışacağını tasarlamaya çalışıyoruz. Birden fazla zaman dilimini (muhtemelen en azından GMT, IST, PST ve EST) destekleyebilmemiz gerekir. Başlangıçta, 15 dakikalık ayrıntı düzeyine kadar geniş bir birleşik tarih saat boyutuna sahip olacağımızı düşünüyorduk. (örn. Tarih Anahtarı, GMT Tarihi, GMT Saati, IST Tarihi, IST Saati, vb ...)

Kimball, tablonun çok büyük büyümesini (veri ambarı araç takımı s. 240) önlemek için gün zaman boyutundan ayrı bir gün boyutuna sahip olmayı önerir, ancak bu kulağa hoş geliyor, ancak her bir zaman dilimi için olgu tablolarımızda iki anahtarımız olduğu anlamına gelir. desteklememiz gerekiyor (biri tarih için, diğeri günün saati için).

Bu alanda çok tecrübesiz olduğumdan, birinin iki yaklaşım arasındaki dengeyi, yani performansa karşı tüm farklı zaman dilimi anahtarlarının yönetimini bildiğini umuyorum. Belki başka yaklaşımlar da var, bazı insanların saat dilimi başına olgu tablosunda ayrı bir satırdan bahsettiğini gördüm, ancak eğer gerçek tablolar milyonlarca satırsa bu bir sorun gibi görünüyor, o zaman zaman dilimleri eklemek için dört katına çıkarmanız gerekiyor .

15 dakikalık bir tane yaparsak, tarih saat boyut tablonuzda yılda 131.400 (24 * 15 * 365) satırımız olacak, bu da performans için çok korkunç görünmüyor, ancak bazılarını test edene kadar kesin olarak bilemeyiz prototip sorguları. Olgu tablosunda ayrı saat dilimi anahtarlarına sahip olmanın diğer kaygısı, sorgunun istenen zaman dilimine göre farklı bir sütuna boyut tablosuna katılması gerektiğidir, belki de bu SSAS'ın sizin için hallettiği bir şeydir, emin değilim .

herhangi bir düşünce için teşekkürler, -Matt


1
Bu soru Yığın Taşması'nda da bulunur: stackoverflow.com/questions/2507289/… .
Tüm

Yanıtlar:


5

Tarih ve saatin ayrı olması, zaman içinde toplu işlemleri kolayca yapmanızı sağlar. örneğin: günün hangi saat diliminde en meşgul olduğunu bulmak için bir sorgu çalıştırmak istiyorsanız. Bu, ayrı bir zaman boyutu kullanılarak çok kolay bir şekilde gerçekleştirilir.

Ayrıca, sadece bir saatiniz olmalıdır. GMT / EST zamanına karar verin - sonra bunu olgu tablosunda kullanın. Raporları diğer saat dilimine göre çalıştırmanız gerekiyorsa, bunu uygulamanızda veya sorgunuzda dönüştürmeniz yeterlidir.


Tamam, bu mantıklı, kullanıcılar verileri daha sonra saat dilimlerine göre gruplayamıyorlar, ancak muhtemelen tasarımı basitleştirmek için onsuz yaşayabileceğimiz bir şey.
Matt Palmerlee

@MattPalmerlee: Kullanıcılar, onlara verirseniz saat dilimine göre gruplayabilirler. Genellikle Geographytabloya eklemek istiyorum , ancak hiçbiri geçerli değilse, gerçek tablonuzun bir özelliği olarak ekleyebilirsiniz.
Tüm

5

Birden fazla Zaman Dilimini desteklemek ve mümkün olduğunca verimli olmak için DataWarehouse'umuzu nasıl uygulamaya karar verdiğimize ilişkin bir takip: Zaman dilimlerinin bir tablosunu (id, ad vb.) Ve "Zaman Dilimi" ni oluşturmayı seçtik köprü "tablosu şöyle görünür:

time_zone_bridge
---------------
date_key_utc
time_key_utc
timezone_id
date_key_local
time_key_local

Bu şekilde normal tarih ve saat boyut tablolarımızı küçük tutabiliriz, tüm gerçeklerimiz UTC tarih / saat anahtarlarına bağlanır, o zaman farklı bir saat dilimine göre raporlamamız / gruplamamız gerekirse, sadece saat dilimi köprü tablosuna katılmamız gerekir ve yerel tarih / saat tuşlarını tarih ve saat boyut tablolarına geri bağlayın. Doğrudan SqlServer'dan TZ şeyler yapmaktan çok daha az karmaşık olduğundan, saat dilimi köprü tabloyu SSIS'den çağrılan C # kodunu kullanarak dolduruyoruz.


Ayrıca, çözümünüzün çok karmaşık bir şeye girmeden muhtemelen en mantıklı olduğunu düşünüyorum. Ben seninkine benzer bir timeZone tablo ve TimeZoneBridge kullanarak DW test ediyorum. Ayrıca TimeDimension ve DateDimension tablolarına sahiptir. TimeZoneBridge kullanarak yerel saati UTC zamanına çevirmek için date_key_local, time_key_local ve timezone_id üzerinde kümelenmiş bir dizin oluşturdum.
dsum

1
Köprü tablosu için birincil kümelenmiş anahtarımız utc tarih / saat sütunları + saat dilimi kimliğinde (doğru hatırlıyorsam), tüm olgu tabloları zaman anahtarları utc içinde olacağından, utc aracılığıyla köprüye katılacaksınız key + tz id, kümelenmiş dizini bunlarda kullanmak daha iyi olabilir. Gereksinimleriniz için mantıklı olanı yapın. Cevabımın birisine yardım ettiğine sevindim, iyi bir yaklaşım olduğunu düşünüyorum ve tüm testlerimizden hala makul derecede hızlı, WHERE yan tümcesi söz konusu olduğunda dikkatli olun: İstediğiniz tarih aralıklarını olabildiğince erken filtreleyin sorgularınızda mümkün.
Matt Palmerlee

Bu yalnızca tam tarihler mi içeriyor? Ya da olgu tablonuzda 86000 "tarih / saat anahtarı" değeriniz varsa, köprü tablosunda 86000 satır * n desteklenen saat dilimi olacaktır ve bu sadece o gün için mi?
Aaron Bertrand

1
belki de sahip olduğunuz tablo tanımını tam olarak ekleyebilirsiniz, böylece okuyucular birincil, benzersiz kısıtlamaları görebilir.
ypercubeᵀᴹ

@AaronBertrand, verilerinizi takip etmek için taneye (veya seçtiğiniz ayrıntı düzeyine) bağlıdır, bizim durumumuzda olgu tablolarımızda yalnızca 15 dakika ayrıntı düzeyine ihtiyacımız vardı, bu nedenle desteklemek istediğimiz saat dilimi başına günde sadece 4 * 24 = 96 kayıt, ki bu tamamen mantıklı.
Matt Palmerlee

2

Kombine bir DateTimeboyut kullanan bir depo fikrinin reddedildiğini gördüm, ancak bunun nedeninin çok açık bir nedenini görmedim. Biraz basitleştirmek gerekirse, şu anda oluşturduğum bilgi tablosu:

Transactions
(
...
CreatedDateTimeSK         INT NOT NULL,  -- Four bytes per date...
AuthorizedDateTimeSK      INT NOT NULL,
BatchSubmittedDateTimeSK  INT NOT NULL,
BatchApprovedDateTimeSK   INT NOT NULL,
SettlementDateTimeSK      INT NOT NULL,
LocalTimeZoneSK           TINYINT NOT NULL  -- ...plus one byte for the time zone
)

DateTimeAlanlar DateTime masaya katılmak:

DateTimes
(
DateTimeSK   INT NOT NULL PRIMARY KEY,
SQLDate      DATE NOT NULL,
SQLDateTime  DATETIME2(0) NOT NULL,
Year         SMALLINT NOT NULL,
Month        TINYINT NOT NULL,
Day          TINYINT NOT NULL,
Hour         TINYINT NOT NULL,
Minute       TINYINT NOT NULL CHECK (Minute IN (0, 30)),
...
)

Bu yarım saatlik bir çözünürlüktedir, bu nedenle günde 48 kayıt, 20 yılda 350.400 - oldukça yönetilebilir.

Etkinlik tarihi / saatleri saklandığında UTC'ye çevrilir, ancak LocalTimeZoneSKalan ve köprü tablosu ile yerel saati almak için kolayca katılabiliriz:

TimeZoneBridge
(
DateTimeSK       INT NOT NULL,
TimeZoneSK       TINYINT NOT NULL,
PRIMARY KEY (DateTimeSK, TimeZoneSK),
LocalDateTimeSK  INT NOT NULL
)

Bugün oluşturulan işlemleri almak için UTC saati:

SELECT COUNT(*)
FROM Transactions AS T
  INNER JOIN DateTimes AS CD ON T.CreatedDateTimeSK = CD.DateTimeSK
WHERE CD.SQLDate = '2014-08-22'

Bugün, işlem için yerel saatle oluşturulan işlemleri almak için:

SELECT COUNT(*)
FROM Transactions AS T
  INNER JOIN TimeZoneBridge AS TZB ON T.CreatedDateTimeSK = TZB.DateTimeSK AND T.TimeZoneSK = TZB.TimeZoneSK
  INNER JOIN DateTimes AS CD ON TZB.LocalDateTimeSK = CD.DateTimeSK
WHERE CD.SQLDate = '2014-08-22'

TimeZoneSKBir REALofset ile değiştirerek işleri basitleştirmek cazip gelebilir (örneğin, ABD Merkezi Yaz Saati için -5.0), ancak bir gerçek kaydı için bazı tarih / saatler Yaz Saati Uygulamasındaysa ve bazıları değilse bu durum bozulacaktır.

Bir olgu kaydı olayları, bir gönderi veya uçuş gibi farklı saat dilimlerinde gerçekleşebilirse, her tarih için bir saat dilimi alanına ihtiyacınız vardır ve tarih başına beş bayta kadarsınız demektir.


Bu yaratıcı bir yaklaşım. Bununla birlikte, birleşik datetime loş tablonuzda sadece 350.400 satırınız olacağını söylediğiniz gibi, tahılları daha ince bir çözünürlüğe değiştirmeye başlarsanız, milyonlarca kayda hızla girersiniz. Zaman boyutundan ayrı bir tarih boyutuna sahip olmayı seçerseniz, zaman boyut tablonuzda yalnızca 48 satır ve tarih boyut tablonuzda yılda yalnızca 365 satır (veya 20 yılda 7300 satır) olur. Olgu tablonuzda date_key ve time_key için bir sütun bulunur. Bu, yalnızca tarih ayrıntı düzeyi gerektiren bazı olgu tablolarınız varsa daha esnek hale getirir.
Matt Palmerlee

1
Bir boyuttaki bir milyon satır beni ilgilendirmiyor - veriler yalnızca on yılda bir değiştiriliyor ve PK'daki bir kaplama dizini ve en çok kullanılan iki veya üç alan çok az miktarda sunucu RAM'i alacak. Ancak, SMALLINTbir milyar satırlık olgu tablosuna yarım düzine s eklemek 12 GB artı ek yüktür ve şimdi gerçek paradan bahsediyorsunuz. Yalnızca tarihi kaydetmesi gereken tarihler için, bunları uygun tarih için "12:00 AM" kaydına yönlendirebilirsiniz.
Tüm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.