다음을 통해 공유


핫 및 콜드 테이블 파티션을 사용하여 매우 큰 Power BI 데이터 모델 최적화

이 문서에서는 핫 및 콜드 테이블 파티션을 사용하여 매우 큰 데이터 모델을 최적화하는 방법을 설명합니다. 파티션은 테이블의 데이터를 개별 하위 집합으로 나누는 방법을 제공합니다. 파티션은 표준 Power BI 데이터 모델링 도구에 직접 노출되지 않지만 Power BI Desktop 증분 새로 고침 정책을 구성하여 고급 분할 방법을 활용할 수 있습니다. 증분 새로 고침은 데이터 세트에 대한 증분 새로 고침 및 실시간 데이터에 설명된 대로 파티션에 의존합니다. 그러나 핫 및 콜드 테이블 파티션 구성은 증분 새로 고침 정책이 수행할 수 있는 것 이상으로 일반적인 테이블 분할 체계 및 XMLA 기반 도구에 익숙하다고 가정합니다.

사전 요구 사항

이 분할 기술의 상대적 복잡성으로 인해 다음 영역에서 경험이 있는 고급 사용자에게 가장 적합합니다.

  1. 테이블 분할 개념, 가져오기 모드 파티션, DirectQuery 모드 및 이중 모드의 작동 방식을 이해합니다.

  2. XMLA 기반 도구를 사용하여 하이브리드 테이블을 만드는 방법에 대한 지식 하이브리드 테이블은 하나 이상의 가져오기 모드 파티션과 하나의 DirectQuery 파티션을 사용합니다.

  3. 를 지정 DataCoverageDefinition하는 데 사용할 수 있는 DAX 함수의 요구 사항에 대한 지식 Power BI 엔진이 적절한 경우 쿼리 처리에서 이 파티션을 제외할 수 있도록 하이브리드 테이블의 DirectQuery 파티션에 포함된 데이터를 설명하는 DirectQuery 파티션의 새로운 속성입니다. DirectQuery 파티션을 제외하면 불필요한 데이터 원본 쿼리를 방지하고 DAX 쿼리 처리의 성능을 향상시키는 데 도움이 될 수 있습니다.

  4. 일반 테이블 관계와 제한된 테이블 관계의 차이를 이해합니다. 예를 들어 RELATED 함수는 관련 날짜 차원 테이블의 값을 기반으로 팩트 테이블 파티션의 데이터 범위를 정의하려는 경우에 유용합니다. 팩트 테이블 파티션은 RELATED 함수가 값을 가져올 수 없는 날짜 테이블과의 관계가 제한되는 DirectQuery 파티션입니다. 이 시나리오에서 RELATED은 날짜 차원 테이블이 이중 테이블인 경우에만 작동합니다. 날짜 테이블은 DirectQuery 또는 이중 모드여야 합니다. 순수 가져오기일 수는 없습니다.

Power BI가 쿼리 처리에서 DirectQuery 파티션을 잘못 제외할 수 있으므로 잘못 정의된 DataCoverageDefinition 경우 잘못된 결과가 발생할 수 있습니다. 따라서 결과를 와 비교하고 없 DataCoverageDefinition 도록 하여 결과를 합치도록 합니다.

핫 및 콜드 테이블 파티션을 사용하는 경우

다음은 핫 및 콜드 파티션이 기록 분석을 위해 하이브리드 테이블을 미세 조정하는 데 도움이 되는 예제입니다. 수년 동안 누적된 매우 큰 데이터 원본이 있다고 가정합니다. 주요 용도는 지난 몇 년 동안의 최신 데이터를 분석하는 것입니다. 경우에 따라 이전 데이터를 분석하려고 합니다. 아마도 당신은 전년 대비 최근 급격한 판매 증가를 발견했다. 그런 일이 전에 일어났습니까? 판매 추적 시작 이후 가장 높은 매출 급증인가요?

핫 및 콜드 파티션을 지원하지 않으면 이러한 종류의 기록 분석을 수행하려면 최신 데이터와 함께 모든 기록 데이터를 팩트 테이블로 가져와야 합니다. 기껏해야 기본 분석에서 이전 기록 데이터를 사용하지 않기 때문에 리소스를 비효율적으로 사용합니다. 최악의 경우 데이터 볼륨이 너무 커서 전체로 가져올 수도 없습니다. 데이터 모델을 DirectQuery 모드로 전환하고 가져오기 모드에 비해 성능 저하를 허용하거나 별도의 모델을 빌드하고 사용자가 보고서 간에 전환하도록 강제할 수 있습니다. 핫 및 콜드 파티션이 있는 하이브리드 테이블은 더 나은 옵션을 제공합니다.

핫 및 콜드 테이블 파티션을 사용하는 방법

먼저 AdventureWorks 샘플 데이터 모델의 FactInternetSales 테이블에 대해 보여 주는 다음 다이어그램과 같이 최신 데이터에 대한 가져오기 모드 파티션으로 판매 테이블을 구성하고 이전 데이터를 콜드DirectQuery 파티션에 유지합니다. OrderDateKey가 20200101 크거나 같은 모든 행은 핫 가져오기 모드 파티션을 통해 데이터 모델로 가져옵니다. OrderDateKey가 20200101 미만인 행은 콜드 DirectQuery 파티션을 통해 처리됩니다. 이제 Power BI는 가져오기 모드를 사용하여 기본 사용 사례를 신속하게 제공할 수 있으며 DirectQuery 파티션에 이 기능이 적용되었기 때문에 가끔만 분석하는 방대한 양의 기록 데이터를 가져올 필요가 없습니다.

Adventure Works 샘플 데이터 모델의 Fact Internet Sales 테이블 스크린샷 인터넷 판매 테이블이 필터링된 행이 표시되어 열립니다.

AdventureWorks 샘플 데이터 웨어하우스가 있고 따라가려는 경우 일반적인 단계는 다음과 같습니다.

  1. 데이터 세트를 만듭니다. Power BI Desktop 사용하여 AdventureWorks 데이터 세트 및 보고서를 만듭니다. 모든 테이블을 순수 DirectQuery 모드로 포함합니다. 그런 다음 테이블을 제외한 FactInternetSales 모든 테이블을 이중 모드로 변환합니다. FactInternetSales 테이블을 DirectQuery 모드로 둡니다.

  2. 데이터 세트를 업로드합니다. 쓰기 작업에 대해 XMLA 엔드포인트가 사용하도록 설정된 Power BI Premium 호스트되는 작업 영역을 사용합니다.

  3. 호환성 수준을 업데이트합니다. SQL Server Management Studio(SSMS)에서 AdventureWorks 데이터 세트를 사용하여 작업 영역을 엽니다. AdventureWorks 데이터 세트>스크립트>스크립트 데이터베이스를만들기 또는 바꾸기로 마우스 오른쪽 단추로 클릭하고 새 쿼리 편집기 창을 선택합니다. compatibilityLevel 속성을 1603 이상으로 설정합니다. 실행을 선택하거나 F5 키를 누릅니다. 작업이 성공적으로 완료되었는지 확인합니다.

    호환성 수준이 1603으로 설정된 스크립트의 스크린샷

  4. FactInternetSales 테이블 파티션을 구성합니다. AdventureWorks 데이터 세트>스크립트>스크립트 데이터베이스를만들기 또는 바꾸기로 마우스 오른쪽 단추로 클릭하고 새 쿼리 편집기 창을 선택합니다. 전체 파티션 섹션을 다음 섹션으로 바꿉니다. 환경에서 AdventureWorksDW 데이터베이스를 가리키도록 Sql.Database 줄을 업데이트해야 합니다. 실행을 선택하거나 F5 키를 누릅니다. 작업이 성공적으로 완료되었는지 확인합니다.

       "partitions": [ 
        { 
          "name": "FactInternetSales-DQ-Partition", 
          "mode": "directQuery", 
          "dataView": "full", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demo.database.windows.net\", \"AdventureWorksDW\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] < 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          } 
        }, 
        { 
          "name": "FactInternetSales-Import-Partition", 
          "mode": "import", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demo.database.windows.net\", \"AdventureWorksDW\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] >= 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          } 
        } 
      ],    
    
  5. 데이터 모델을 처리합니다. Power BI 포털에서 AdventureWorks 데이터 세트로 작업 영역을 열고 데이터 세트의 주문형 새로 고침을 수행하여 데이터와 함께 가져오기 파티션을 로드합니다.

  6. 보고서에 최근 및 기록 데이터가 표시되는지 확인합니다. AdventureWorks를 열고 다음 스크린샷과 같이 보고서가 2020년 1월 1일 전후의 판매 트랜잭션 결과를 표시할 수 있는지 확인합니다.

서로 다른 두 보고서의 스크린샷. 하나는 2020의 데이터를 보여주고 하나는 2019의 데이터를 보여줍니다.

DirectQuery 파티션의 데이터 검사 정의

이 솔루션은 최근 및 기록 데이터에 대해 원활하게 작동합니다. 그러나 기본적으로 Power BI는 각 파티션이 다루는 데이터를 모르기 때문에 모든 테이블 파티션을 쿼리합니다. 따라서 Power BI는 DirectQuery 파티션이 다루지 않는 기간 동안에도 DirectQuery 파티션을 쿼리합니다. 판매 데이터는 가져오기 파티션에서 쉽게 사용할 수 있으며 DirectQuery 파티션은 행을 제공하지 않지만 이 불필요한 원본 쿼리는 여전히 데이터 원본에 눈에 띄는 로드를 유발하고 DAX 쿼리 처리에 지연을 줄 수 있습니다. 이 불필요한 원본 쿼리를 방지하려면 를 사용합니다 DataCoverageDefinition.

다음 스크린샷에서 보여 주듯이 Power BI 보고서는 각 시각적 개체의 DAX 쿼리로 인해 Power BI가 DirectQuery 파티션을 쿼리하도록 하므로 2020년 동안 불필요한 여러 SQL 쿼리를 데이터 원본으로 보냅니다.

DAX 쿼리의 스크린샷

다음 TMSL 코드 조각에서와 같이 DirectQuery 파티션에서 속성을 설정 dataCoverageDefinition 하면 이러한 SQL 쿼리는 방지됩니다. 그러나 데이터 검사 정의를 적용하거나 변경한 후에는 데이터 세트를 새로 고쳐야 합니다. 프로세스 다시 계산은 데이터 검사 정의를 평가하기에 충분합니다. 이 단계를 잊어버린 경우 파티션을 터치하는 쿼리는 "테이블 '[테이블 이름]'에 있는 DQ 파티션의 DataCoverageDefinition이 최근 변경 후 아직 계산되지 않음"이라는 오류 메시지와 함께 실패합니다. 다시 처리해야 합니다."

        { 
          "name": "FactInternetSales-DQ-Partition", 
          "mode": "directQuery", 
          "dataView": "full", 
          "source": { 
            "type": "m", 
            "expression": [ 
              "let", 
              "    Source = Sql.Database(\"demopm.database.windows.net\", \"AdventureWorksDW2020\"),", 
              "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],", 
              "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] < 20200101)", 
              "in", 
              "    #\"Filtered Rows\"" 
            ] 
          },  
"dataCoverageDefinition": {  
                  "description": "DQ partition with all sales from 2017, 2018, and 2019.",  
                  "expression": "RELATED('DimDate'[CalendarYear]) IN {2017,2018,2019}"  
                }  
        } 

앞에서 설명한 대로 속성은 dataCoverageDefinition 불필요한 데이터 원본 로드를 제거하는 데 도움이 됩니다. 또한 Power BI가 적절한 경우 DAX 쿼리 처리에서 DirectQuery 파티션을 제외할 수 있으므로 최근 데이터에 대한 분석 성능도 향상됩니다. 단순 AND, OR 및 NOT 연산자를 사용하는 범위뿐만 아니라 단일 값에 대한 간단한 데이터 검사 식을 정의할 수 있습니다. RELATED 함수를 사용하여 팩트 테이블과 정기적으로 관계가 있는 차원 테이블의 열을 기반으로 데이터 범위를 정의할 수도 있습니다. 데이터 검사 식에서 차원 테이블의 열을 사용하는 경우 차원 테이블이 이중 모드인지 확인합니다. 팩트 테이블 자체의 열에 따라 데이터 검사를 정의할 수도 있습니다. 세 그룹으로 분류된 지원되는 작업에 대해서는 다음 표를 참조하세요. 

유형 의견 예제
단일 조건자(값 기반) 같음, 같지 않음 및 IN 연산자
차원 및 팩트 테이블 모두 지원
RELATED('Date'[Year]) = 2020
NOT RELATED('Date'[Year]) = 2020
RELATED('Date'[Year]) in {2020, 2021, 2022}
InternetSales'[SalesAmt] = CURRENCY(100.0)
NOT InternetSales'[SalesAmt] = CURRENCY(100.0)
InternetSales'[SalesAmt] IN {CURRENCY(100.0), CURRENCY(200.0)}
단일 조건자(범위 기반) , , <>=, <= 같은 >비교 연산자일 수 있습니다.
차원 테이블이 이중 모드여야 합니다.
RELATED('Date'[Year]) > 2020
RELATED('Date'[Year]) <= 2020
여러 조건자 같음, 같지 않음 및 비교
IN 연산자가 지원되지 않음
이중 모드의 단일 차원 테이블로 제한됨
RELATED('Date'[Year]) > 2010 && RELATED('Date'[Year]) > 2020
RELATED('Date'[Year]) = 2020 && RELATED('Date'[Calendar Quarter]) = 1
RELATED('Date'[Year]) > 2020 && NOT RELATED('Date'[Calendar Quarter]) = 1
RELATED('Date'[Year]) > 2020 && RELATED('Date'[Calendar Quarter]) < 3
RELATED('Date'[Year]) > 2020 && (RELATED('Date'[Calendar Quarter]) = 1 || RELATED('Date'[Calendar Quarter]) = 2)

DirectQuery 파티션의 DataCoverageDefinition 속성을 사용하면 데이터 원본의 불필요한 쿼리를 방지하여 가져오기 모드의 핫 파티션과 DirectQuery 모드의 콜드 파티션을 기반으로 하는 가장 큰 Power BI 데이터 모델도 최적화할 수 있습니다. 이 원본 쿼리 감소는 핫 데이터를 분석할 때 보고서 성능을 향상시키는 데 도움이 됩니다. 또한 데이터 원본의 부하를 줄이는 데 도움이 되며, 이러한 방식으로 데이터 원본의 크기를 최대화하는 데 도움이 됩니다. 그러나 속성을 사용하여 dataCoverageDefinition 데이터 모델을 최적화하는 것은 여전히 고급 시나리오입니다. 결과를 신중하게 확인해야 합니다.

고려 사항 및 제한 사항

  • 현재 DirectQuery 파티션의 DataCoverageDefinition 속성에는 {2020, 2021, 2022}의 RELATED('Date'[Year]) = 2020 또는 RELATED('Date'[Year])와 같은 정적 값이 필요합니다. RELATED('Date'[DateKey]) = TODAY()와 같은 동적 할당은 지원되지 않습니다.

  • 실시간 데이터를 사용하여 증분 새로 고침은 속성을 활용 DataCoverageDefinition 하지 않습니다. DirectQuery(실시간) 파티션에 데이터 검사 정의를 적용하면 파티션을 다시 만들 때 증분 새로 고침이 데이터 검사 정의를 삭제합니다.