데이터 마트 / 창고에서 시간대 처리


12

우리는 데이터 마트 /웨어 하우스의 빌딩 블록을 설계하기 시작했으며 모든 시간대를 지원할 수 있어야합니다 (고객은 전 세계에서 왔습니다). 온라인 (및 서적) 토론을 읽음으로써 일반적인 해결책은 팩트 테이블의 시간 소인뿐만 아니라 별도의 날짜 및 시간 차원을 갖는 것 같습니다.

그러나 대답하기 어려운 질문은 동적 시간대 요구 사항을 고려할 때 날짜 및 시간 차원이 실제로 어떤 이점을 줍니까? 시간 차원이 좀 더 의미가 있지만 날짜 차원으로 어려움을 겪고 있습니다. 날짜 차원에 대한 일반적인 디자인 방식에는 일반적으로 요일 이름, 요일, 월 이름 등의 속성이 포함됩니다. 2013 년 12 월 31 일 화요일 오후 11시 (UTC)의 모든 문제는 수요일입니다. , UTC + 2 이후의 모든 시간대에서 2014 년 1 월 1 일

따라서 각각의 모든 쿼리 (및 보고서)에서 이러한 시간대 변환을 모두 수행 해야하는 경우 아마도 사용하지 않을 속성을 저장하고 저장하는 요점은 무엇입니까? 어떤 사람들은 각 시간대마다 사실 행을 제안하지만 그것은 나에게 우스운 것 같습니다. 매달 수백만 건의 레코드를 저장할 수 있어야합니다.

다른 사람들은 시간대 브리지 테이블을 제안하지만, 이는 의미가 있지만 클라이언트 응용 프로그램과 보고서가 날짜를 쉽게 알아낼 수있는 무언가를 달성하기 위해 추가 복잡성과 추가 조인처럼 보입니다 (보고는 주로 웹 기반입니다) 날짜 변환, 표시 및 서식 지정에 도움이되는 수많은 라이브러리가있는 경우).

내가 생각할 수있는 유일한 것은 날짜 및 시간별로 그룹화의 용이성과 가능한 성능이지만 datepart (MS SQL을 사용하고 있지만 수백만 행을 쿼리 할 것입니다)별로 그룹화하는 것이 나쁜 방법입니다. 월요일과 같은 대부분의 리터럴은 시간대가 시작될 때별로 의미가 없기 때문에 시간, 일, 월 및 연도 숫자를 초과하지 않는 매우 간단한 날짜 및 시간 차원입니까?


1
나는 당신이 겪고있는 것이 datetimeoffset 데이터 유형이라고 생각하고 모든 날짜를 UTC 표현으로 저장합니다. 그런 다음 데이터를 추출해야하는 경우 UTC 값으로 데이터를 쿼리하여 클라이언트가 현지 시간으로 데이터를 나타내도록합니다.
Allan S. Hansen

6
시간과 관계없이 날짜를 저장하고 싶은 이유가 없다고 생각할 수 있습니다. 모두 UTC 날짜 / 시간으로 저장하고 프리젠 테이션 레이어가 현지화에 대해 걱정하게하십시오.
billinkc

1
@billinkc에 동의합니다. 시간대 변환을 수행하기 위해 지속적으로 다시 정리할 때 날짜와 시간을 별도로 저장하면 어떤 이점이 있는지 잘 모르겠습니다.
mmarie

2
@billinkc : "시간과 관계없이 날짜를 저장하고 싶은 이유는 없다고 생각합니다." - 저 할 수 있어요. 창고에서 큐브를 만들 때마다. 별도의 날짜 및 TimeofDay 차원을 갖는 것이 일반적이며 모범 사례입니다.
Mitch Wheat

@MitchWheat (아마도 답을 작성하고 있음)을 이해하도록 도와 줄 수 있습니까? 저는 전 세계 판매를하는 성인 회사이며 2300 GMT에서 판매가 크게 증가했습니다. 슬라이서를 보고서로 끌어다 놓았습니다. 미국 동부 및 중부 표준 시간대에서는 사람들이 집으로가는 도중에 포장 된 음료를 마실 때 약간의 판매가 진행될 수 있지만 인도에서는 0330인데 그 시간에 아무도 Kingfisher를 집어 들지 않습니다. 그리고 퍼스의 6시 Y'all은 힘을 쓰지만 VB로 양치질을하는 사람은 누구입니까? 대신, 사람들은 퇴근 후 술을 사서 1700 년이되었지만 날짜 경계에 대해 걱정해야합니다
billinkc

답변:


7

먼저 ...

차원과 차원 Datime/Time으로 분리 하는 것이 확실합니다.DateTime

당신이를 복제 할 필요가있는 복수 시간대를 관리하려면 DateKey하고, TimeKey그래서 당신은 다음을 가지고 :

  • LocalDateKey
  • LocalTimeKey
  • UtcDateKey
  • UtcTimeKey

당신은 말합니다 ...

내가 가진 모든 문제는 UTC + 2 이후의 모든 시간대에서 2013 년 12 월 31 일 화요일 오후 11시 (UTC)입니다 .2014 년 1 월 1 일 수요일입니다.

위에 나열된 4 개의 열이 있으면 테이블 별칭을 사용하여 팩트 테이블을 날짜 및 / 또는 시간 차원에 조인 할 수 있습니다 (Kimball 용어에서는 이러한 별칭이 지정된 차원 테이블을 "역할 재생 차원"이라고 함). 다음과 같은 것이 있습니다.

/*
    Assumes the following:
        - [DateLongName] has the format of this example "Tuesday, December 31, 2013"
        - [TimeShortName] has the format of this example "11:00 PM"
        - Both [DateLongName] & [TimeShortName] are strings
*/
select
    -- Returns a string matching this example  "11:00 PM Tuesday, December 31, 2013"
    localTime.TimeShortName + ' ' + localDate.DateLongName
    ,utcTime.TimeShortName + ' ' + utcDate.DateLongName
    ,f.*
from
    FactTableName  AS f

    -- Local Date and Local Time joins          
    inner join dbo.Date  AS localDate
        on localDate.DateKey = f.LocalDateKey

    inner join dbo.Time  AS localTime
        on localTime.TimeKey = f.LocalTimeKey 

    -- Utc Date and Utc Time joins    
    inner join dbo.Date  AS utcDate
        on utcDate.DateKey = f.UtcDateKey

    inner join dbo.Time  AS utcTime
        on utcTime.TimeKey = f.UtcTimeKey 

닫는 중 ...

당신은 OLTP 데이터베이스를 데이터 마트를 구축하고,하지 않을 때, 로컬 및 UTC 시대의 생성은 당신의 ETL 수행해야한다 , 하지 떨어져에 UTC 시간의 현지화에서 (다음과 같은 이유로 모든 클라이언트 측 애플리케이션에 보고서 독자의 관점) :

  • 계산이 모든 쿼리에 상주하면 보고서에 대해 해당 쿼리를 실행해야하는 횟수를 곱한 결과에 추가 성능 부담이 발생합니다 (수백만 행을 읽을 때 중요 함).
  • 각 쿼리에서 계산을 올바르게 유지해야하는 추가 부담 (특히 일광 절약 시간을 고려할 때)
  • 열에 대한 계산을 수행 할 때 쿼리가 탐색 대신 인덱스 스캔을 수행하도록하는 열에 대한 계산을 수행하므로 열에 대한 범위 스캔을 방지하십시오 (일반적으로 각 데이터 페이지를 읽어야 할 때 더 비쌉니다). 이는 것으로 알려진 스 SARGable .
    • 주석으로 인해 편집 : 변환을 실제 쿼리 로 푸시 할 경우 적용됩니다 .
  • 추가 UTC 날짜 및 시간을 사용할 수 있다는 개념을 사용하면이 개념을 취하고이를 확장하여 확장 할 수 있습니다 StandardisedDateKey. 또는 CorporateHQDateKeyUTC 날짜 테이블 대신 다른 비즈니스 계약 표준에 따라 표준화합니다.
  • 두 개의 개별 열 유형 (로컬 및 UTC)을 사용하면 지리적 거리에서 나란히 비교할 수 있습니다. 생각 - 호주에서 누군가가 로컬 및 UTC 모두 소인이되는 기록을 입력>, 뉴욕에서 누군가가 지역 (호주) 날짜와 시간에 보고서를 읽어 UTC 날짜와 시간의 뉴욕 표현을하여 뭔가를보고 그들의 호주인은 하루 중 (오스트레일리아)에 한밤중에 (뉴욕 시간) 일을했습니다. 다국적 기업에서는 이러한 시간 비교가 필수적입니다.

사용하는 이유는 분리 Date하고 Time대신 하나의 크기 DateTime? 팩트 테이블에는 여러 날짜가있을 수 있으며 각각에 대해 하나 대신 두 개의 INT를 저장하면 더해질 수 있습니다.
모든 거래의 존

1
@Jon of All Trades : 별도의 날짜 및 시간 차원이 가장 좋습니다. 전체 차원 카디널리티를 줄이고 실제로 날짜와 시간을 기준으로 분할하거나 날짜를 기준으로 필터링 한 다음 시간을 기준으로 분할합니다.
Mitch Wheat

0

이 답변의 간결함에 대해 미리 사과 드리며, 근무하지 않을 때 자세히 설명 할 계획입니다.

날짜 및 시간 테이블을 사용하면 데이터를 쉽게 집계 할 수 있으므로 가장 확실한 이점이 있습니다. 많은 경우에 그 성격의 달이나 업무 일을 기준으로 정렬하는 가장 간단한 방법입니다. 그러나 이것이 반드시 타임 스탬프의 유용성을 대체하지는 않습니다. 특별한 경우 UTC 타임 스탬프입니다. 시간 소인이 있으면 보고서 또는 프리젠 테이션 계층에서 해당 시간 소인을 현지 시간으로 변경하기 만하면됩니다. 범위 스캔을 피하려면 요청 범위를 UTC 시간으로 변환해야합니다.

다른 질문이나 의견이 있으면 언제든지 문의하십시오.


1
이것은 질문에 대답하지 않습니다.
Mitch Wheat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.