>source

우리의 눈송이 구현에 다음과 같은 SCD2 차원이 있습니다.

DEAL_SIDE_LEG_DIM

  • DIM_DEAL_ID 번호 대리 PK
  • DEALNO 비즈니스 키
  • DEALSIDE 비즈니스 키
  • DEALLEG 비즈니스 키
  • 다양한 속성
  • VALID_FROM 날짜
  • VALID_TO 날짜

NB -이것은 DEALNO /DEALSIDE /DEALLEG의 비정규화된 계층입니다.

여기서 VALID_TO는 '유효한' 행의 최대 날짜로 설정되고 이전 SCD2 행이 닫힐 때 종료 날짜로 설정됩니다. 우리 창고에서 가장 큰 차원 중 하나일 가능성이 높으며 거래는 일반적으로 상당히 고정된 수명 주기를 거치지만 이 수명의 어느 시점에서든 변경할 수 있으며 수명은 거래마다 크게 다를 수 있습니다.

이는 변동률이 상당히 높지만 변동이 매우 적습니다. 즉, 일반적으로 업데이트가 대리 키 및/또는 비즈니스 키 전체에 널리 퍼져 마이크로파티션 정리를 활용하기 어렵습니다.

많은 수의 거래가 상태에서 업데이트될 때 느린 UPDATE 성능에 문제가 발생합니다. 초기 가지치기에는 그다지 많지 않고 새로운 변경 불가능한 마이크로파티션을 작성할 때 더 많이 생각합니다.

문제 단계입니다.

Update DEAL_DIM
Set Valid_to=Sysdate()
Where filter_criteria

이것은 filter_criteria가 비즈니스 키 목록인지 또는 대리 키 목록인지에 관계없이 부분적으로 전달되는 행이 너무 희박하고 이러한 키가 잘 클러스터되지 않기 때문입니다(높은 카디널리티 및 큰 겹침 및 깊이).

현재 테이블에 클러스터링이 없습니다. 성능을 개선하기 위해 탐색할 가치가 있는 것이 있습니까? 아니면 업데이트 그룹화를 예측하기 어려운 경우 유형 2 SCD의 레code 닫기가 항상 비용이 많이 들 것이기 ​​때문입니까?

클러스터링에 유효성을 사용하는 것을 고려했지만 여전히 업데이트 행이 '유효한' 마이크로 파티션에 흩어져 있어 초기 정리(비용이 많이 드는 부분이 아님)만 줄이고 업데이트 비용을 개선하지 않을 가능성이 높습니다. (커버 아래에서 무슨 일이 일어나고 있는지 올바르게 결정한 경우)

또 다른 옵션은 DEALNO(또는 DEALNO 범위)별로 그룹화하는 것인데, 업데이트가 모두 적용되는 경우 최소한 DEAL의 하위 항목을 함께 그룹화해야 하지만 거래 수명의 차이는 여전히 DEALNO의 넓은 범위를 의미합니다. 그리고 다시 저는 이것이 VALID_TO 종료 날짜에 대해서만 재작성되는 많은 수의 마이크로 파티션으로 이어진다고 생각합니다.

아마도 차원 계층으로 다시 정규화해야 하는 지나치게 비정규화된 설정을 가리킬 수 있지만 잠재적으로 '최하위' 수준에서 희소 업데이트의 비용이 여전히 높을 수 있습니다.

업데이트 중인 행 수 및 가능한 경우 쿼리 프로필과 같은 추가 정보를 제공해 주시겠습니까? 일반적으로 Snowflake의 클러스터 열은 Snowflake에 의해 결정되며 쿼리가 매우 느리게 실행되고 테이블 크기가 1TB 이상인 경우 변경합니다(테이블 크기를 알려주세요)

hkandpal2021-10-17 01:27:12

테이블의 물리적 열로 VALID_TO가 필요합니까? 업데이트 작업은 모든 데이터베이스에서 비용이 많이 드는 경향이 있으므로 다른 방법은 VALID_FROM 날짜만 저장하는 것입니다. 그런 다음 LEAD()와 같은 창 함수를 사용하여 VALID_TO 날짜를 계산하는 테이블 위에 뷰를 만듭니다. 이것이 귀하의 상황에 적용되는지 확실하지 않지만 고려해야 할 아이디어입니다.

Maja F.2021-10-17 01:27:12

@hkandpal Snowflake는 클러스터 열을 결정하지 않습니다. 클러스터링되지 않았거나(클러스터링 없이 데이터가 로드될 때 마이크로 파티션이 생성됨) 성능을 위해 테이블이 명시적으로 클러스터링되었습니다. 그리고 일반적인 지침은 1TB 이상이지만 더 작은 테이블에서 클러스터링을 구현하는 데에는 많은 이유가 있습니다.

Mike Walton2021-10-17 01:27:12

@Mike 정정해주셔서 감사합니다.

hkandpal2021-10-17 01:27:12

@MajaF. 흥미로운 아이디어지만 일반적으로 사용되는 차원으로서 업데이트 비용을 절감하는 것보다 매번 최신 버전을 사실에 연결할 때 추가 조회 비용이 더 클 것이라고 생각합니다.

Matt Prince2021-10-17 01:27:12
  • 이전 application.name_IS_UNDEFINED.log는 어디에서 왔습니까?
  • 다음 reactjs : useSelector 호출 상태가 정의되지 않거나 영원히 로드되기 전에