1

내가, 내가 구조를 유형 II 치수는 다음과 같이

CREATE TABLE TransactionState 
(
    TransactionStateId INT IDENTITY (1, 1) NOT NULL, 
    TransactionStateName VarChar (100) 
) 

이 내 OLAP에 와서 OLTP

에서 다음 표 룩업 테이블을 변경 한 조인 기둥. 시간이 지남에 따라 OLAP에는 TransactionStateId 값이 중복 될 수 있지만 StartDateTime과 EndDateTime을 조합하면 고유합니다.

OriginalTransactionStateId가 추가되고 들어오는 TransactionStateId가 매핑 된 Type-2 차원의 샘플을 보았습니다. 그리고 새로운 TransactionStateId IDENTITY 필드가 PK가되어 조인에 사용됩니다.

CREATE TABLE TransactionState 
(
    TransactionStateId INT IDENTITY (1, 1) NOT NULL, 
    OriginalTransactionStateId INT NOT NULL, /* not an IDENTITY column in OLAP */ 
    TransactionStateName VarChar (100) NOT NULL, 
    StartDateTime DateTime NOT NULL, 
    EndDateTime NULL 
) 

bachellorete # 2 또는 bachellorete # 3과 함께해야할까요? 이 구절에 의해

답변

2

: StartDateTimeEndDateTime의 조합으로

, 그들은 독특한 될 것이다.

당신은 그들이 중복 결코 또는 데이터베이스 UNIQUE 제약 조건을 만족한다는 것을 의미?

전자의 경우 조인에 StartDateTime을 사용할 수 있지만 "=" 대신 "<=" 조건을 사용하므로 비효율적 일 수 있습니다.

후자의 경우 가짜 신원을 사용하십시오. 일반적으로

데이터베이스는이 쿼리에 대한 효율적인 알고리즘을 허용하지 않습니다 :

SELECT * 
FROM TransactionState 
WHERE @value BETWEEN StartDateTime AND EndDateTime 

을, 당신은 SPATIAL 데이터와 비밀의 트릭을하지 않는 한. 가능성의 최적화를 박탈합니다

SELECT * 
FROM factTable 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM TransactionState 
     WHERE StartDateTime <= factDateTime 
     ORDER BY 
       StartDateTime DESC 
     ) 

는, 많은 경우에 이러한 쿼리에 대한 가장 효율적인 HASH JOIN를 사용하는 : 당신이 JOIN에서이 조건을 사용해야합니다 왜

는 그입니다.

이 방법에 대한 자세한 내용은이 문서를 참조하십시오 : 그것은 HASH JOIN600% 배 성능 향상 결과 사용할 수 있도록 날짜 시간 경우에만 가능하지만,

쿼리를 다시 쓰기를 하루 이하의 정확도를가집니다 (또는 해시 테이블이 매우 커질 수 있습니다).날짜 범위 이상 100 날짜에 걸쳐있는 경우,

WITH cal AS 
     (
     SELECT CAST('2009-01-01' AS DATE) AS cdate 
     UNION ALL 
     SELECT DATEADD(day, 1, cdate) 
     FROM cal 
     WHERE cdate <= '2009-03-01' 
     ), 
     state AS 
     (
     SELECT cdate, ts.* 
     FROM cal 
     CROSS APPLY 
       (
       SELECT TOP 1 * 
       FROM TransactionState 
       WHERE StartDateTime <= cdate 
       ORDER BY 
         StartDateTime DESC 
       ) ts 
     WHERE ts.EndDateTime >= cdate 
     ) 
SELECT * 
FROM factTable 
JOIN state 
ON  cdate = DATE(factDate) 

CTEMAXRECURSION 옵션을 조정 : 당신의 시간 구성 요소 이후

StartDateTimeEndDateTime 당신의 박탈되고,이 같은 CTE을 만들 수 있습니다.

+0

@Quassnoi : 시간 구성 요소는 StartDateTime과 EndDateTime에서 모두 제거되며 하루 간격으로 분리됩니다. –

+0

@Quassnio : 코드 샘플을 가져 주셔서 감사합니다. 2 명의 bachellorettes에 대한 나의 최초의 질문에 대한 당신의 견해는 무엇입니까? –

+1

@Tapori : "bachelorettes"에 의해'SCD' 타입을 의미하는 경우,'Type 2'가 더 낫습니다. 각 상태의 버전이 2보다 많을 것입니다. 일반적으로 (게시물에 설명 된 이유로) 쿼리 속도가 느린 것으로 간주되지만 게시물의 기술을 사용하면 훌륭한 성능을 얻을 수 있습니다. – Quassnoi

1

IDENTITY(1,1)은 해당 열의 값을 자동으로 생성하기위한 선언입니다. 이것은 PRIMARY KEY과 다르며, 열을 기본 키 클러스터형 인덱스로 만드는 선언입니다. 이 두 선언은 다른 것을 의미하며 PRIMARY KEY을 말하지 않으면 성능에 영향을 미칩니다.

+0

@ David B : 용서를 구했는데, 나는 테이블에 대해 전체 DDL을 게시하지 않았습니다. 코드는 그것을 OTTOMH로 게시했습니다. 내 질문은 데이터웨어 하우스 디자인에 관한 것이었기 때문에 나는 그 부분에 중점을 두었다. –

1

SSIS를 사용하여 DW를로드 할 수도 있습니다. slowly changing dimension (SCD) 변환에서 각 속성을 처리하는 방법을 설정할 수 있습니다. 히스토리 속성이 선택되면 유형 2 SCD가 전체 행에 적용되고 변환이 세부 사항을 처리합니다. start_date, end_date 또는 current/expired 열을 선호하는 경우에도 구성 할 수 있습니다.

여기서 차별화되는 것은 기본 키와 비즈니스 (자연) 키의 차이입니다. 기본 키는 테이블의 행을 고유하게 식별합니다. 비즈니스 키는 비즈니스 개체/엔티티를 고유하게 식별하며 차원 테이블에서 반복 될 수 있습니다. SCD 2가 적용될 때마다 새로운 기본 키가 있지만 동일한 비즈니스 키가있는 새로운 행이 삽입됩니다. 이전 행은 만료 됨으로 표시되고 새 행은 현재로 표시됩니다. 또는 시작 날짜 및 종료 날짜 필드가 적절하게 채워집니다.

DW에는 기본 키가 노출되어서는 안되기 때문에 OLTP에서 들어오는 데이터에는 비즈니스 키가 포함되며 기본 키 할당은 DW가 제어합니다. IDENTITY int는 차원 테이블의 PK에 적합합니다.

멋진 점은 SSIS의 SCD 변환이이 문제를 처리한다는 것입니다.