Table of Contents

设置增量刷新

增量刷新设置 Visual 摘要


要设置增量刷新,你必须为该表配置一项新的刷新策略。 将 EnableRefreshPolicy 设为 True 后,配置刷新策略属性即可:

Important

使用 Tabular Editor 3 设置增量刷新仅适用于托管在 Power BI Datasets 服务中的 Dataset。 对于 Analysis Services,则需要自定义 分区

配置新的刷新策略

  1. 连接到模型: 连接到 Workspace 的 Power BI XMLA endpoint,并打开要配置增量刷新的 Dataset。
  2. 创建 RangeStartRangeEnd 参数: 增量刷新要求先创建 RangeStartRangeEnd 参数(了解详情)。 在 Tabular Editor 中新增两个共享表达式:
Apply Refresh Policy
  1. 配置 RangeStartRangeEnd 参数: 分别将它们命名为 RangeStartRangeEnd,把它们的 Kind 属性设置为 "M",并将表达式设置为以下内容(你填写的实际日期/时间值无关紧要,因为在开始数据刷新时,Power BI Service 会设置它):
#datetime(2021, 6, 9, 0, 0, 0) 
   meta 
   [
      IsParameterQuery=true, 
      Type="DateTime", 
      IsParameterQueryRequired=true
   ]
Apply Refresh Policy
  1. 复制分区的 M 代码: 定位到要配置增量刷新的表。 将其展开,并选择包含 Power Query M 表达式的分区。 把代码复制到记事本中,第 6 步会用到。

  2. 启用表刷新策略:“Properties” 窗口中,将该表的 EnableRefreshPolicy 属性设置为 True

Apply Refresh Policy
  1. 配置表的刷新: 接下来,选择要为其配置增量刷新的表。 在 表达式编辑器 窗口中,从下拉列表中选择 'Source Expression',插入第 4 步中的 Power Query M 表达式,并调整该 Power Query M 表达式,使其在将要启用增量刷新的日期列上包含一个筛选步骤。

    下面是一个可用的筛选步骤示例:

// 筛选步骤必须能够折叠回数据源
// 在此之前的任何步骤都不应破坏查询折叠
#"增量刷新筛选步骤" = 
    Table.SelectRows(
        Navigation,
        each 
            [OrderDate] >= #"RangeStart" and 
            [OrderDate] < #"RangeEnd"
    )

对于日期、字符串或整数类型的列,你仍然可以在保持查询折叠的同时进行筛选——只需使用函数将 RangeStartRangeEnd 转换为相应的数据类型。 有关详细信息,请参阅此处

  1. 配置刷新策略: 根据你所需的增量刷新策略配置其余属性。 记得为 SourceExpression 属性指定一个 M 表达式(该表达式会添加到由增量刷新的刷新策略创建的分区中,并应使用 RangeStartRangeEnd 参数在源中筛选数据)。 = 运算符只能用于 RangeStart 或 RangeEnd 其中之一,不能同时用于两者,否则可能导致数据重复。

    • Source Expression: 将添加到由刷新策略创建的分区的 M 表达式。
    • IncrementalWindowGranularity: 增量(刷新)窗口的粒度。
    • IncrementalWindowPeriods: 需要刷新的周期数(按上面指定的粒度)。
    • IncrementalWindowPeriodsOffset: 设置为 -1 以启用 “Only Refresh Complete Periods” 选项
    • RollingWindowGranularity: 滚动(归档)窗口的粒度。
    • RollingWindowPeriods: 需要归档的周期数(按上面指定的粒度)。
    • Mode: 是标准 Import 刷新策略还是 Hybrid,其中最后一个分区为 DirectQuery。
    • PollingExpression: 用于检测数据更改的有效 M 表达式。 有关 Polling Expression 或其他刷新策略属性的更多信息,请参阅此处
  2. Apply Model Changes: 保存模型(Ctrl+S)。

  3. 应用刷新策略: 右键单击该表,然后选择“应用刷新策略”。

Apply Refresh Policy

就这样! 此时你应该会看到,Power BI 服务已根据你指定的策略,自动为表生成了分区。 剩下的就是刷新所有分区。

Refresh All Partitions
  1. 刷新所有分区: 按住 Shift 键并单击,选中所有分区。 右键单击并选择 刷新 > 完全刷新(分区)。 你可以右键单击该表并选择 “预览数据” 来查看结果。
Refresh All Partitions

最后,你可以在 Power BI 服务中配置计划刷新。 Power BI 会自动为你的表进行分区处理。 你随时都可以连接到远程模型来查看并验证分区,例如使用 VertiPaq分析器。


使用整数日期键的增量刷新

如果你的日期列是整数数据类型,请用下面的内容替换上面步骤 4 中的筛选步骤:

  1. 创建自定义函数: 创建一个名为 ConvertDatetimeToInt 的共享表达式:
   // A custom M function which will return a DateTime value as a YYYYMMDD integer
   (DateValue as datetime) => 
        Date.Year(DateValue) * 10000 + Date.Month(DateValue) * 100 + Date.Day(DateValue)
  1. 创建筛选步骤: 使用该自定义函数在筛选表达式中将 RangeStartRangeEnd 转换为整数。 除此之外,该筛选步骤与日期列为 DateTime 类型时完全相同:
let
   // 连接到你的数据源
   Source = 
      Sql.Database(#"SqlEndpoint", #"Database"),

// Load the table data
   Data = 
      Source{ [Schema="Factview", Item="Orders"] }[Data],

   // 进行应折叠回数据源的任何转换
   #"Remove Unnecessary Columns" = 
      Table.RemoveColumns ( 
         Data, 
         {
            "DWCreatedDate", 
            "Net Invoice Cost"
         } 
      ),

   // 添加增量刷新筛选步骤
   //    The filter step must be able to fold back to the data source
   //    No steps before this should break query folding
   #"Incremental Refresh" = 
     Table.SelectRows(
       #"Remove Unnecessary Columns",
         each [OrderDateKey] >= ConvertDatetimeToInt(#"RangeStart")
         and  [OrderDateKey] < ConvertDatetimeToInt(#"RangeEnd")
     )
in
   #"Incremental Refresh" 
  1. 按常规继续后续步骤: 然后,你可以使用 “应用刷新策略” 来配置并应用刷新策略,最后刷新所有分区。 刷新操作完成后,预览该表的数据以查看结果。

使用字符串日期键的增量刷新

如果你的日期列是字符串数据类型,你应该配置筛选步骤,在不破坏查询折叠的情况下解析日期列。 具体做法会因数据源以及日期格式而异。 下面是一个假设示例,订单日期采用“YYYY-MM-DD”格式:

let
   // 连接到你的数据源
   Source = 
      Sql.Database(#"SqlEndpoint", #"Database"),

   // Load the table data
   Data = 
      Source{ [Schema="Factview", Item="Orders"] }[Data],

   // Make any transformations that should fold back to the    数据源
   #"Remove Unnecessary Columns" = 
      Table.RemoveColumns ( 
         Data, 
         {
            "DWCreatedDate", 
            "Net Invoice Cost"
         } 
      ),

   // 添加增量刷新筛选步骤
   //    The filter step must be able to fold back to the   data source
   //    No steps before this should break query folding
   #"Incremental Refresh" = 
     Table.SelectRows(
       #"Remove Unnecessary Columns",
       each 

       // Converts "2022-01-09" to DateTime, for example
       DateTime.From(
         Date.FromText(
           [OrderDate], 
           [Format="yyyy-MM-dd"]
         )
       ) >= #"RangeStart"

       and 

       DateTime.From(
         Date.FromText(
           [OrderDate], 
           [Format="yyyy-MM-dd"]
         )
       ) < #"RangeEnd"      
     )
in
   #"Incremental Refresh" 

另请参阅 Power Query 中 Date.FromText 函数的文档:此处。 如果无法在保留查询折叠的同时内联转换日期列,也可以按下文所述,通过本机查询来配置增量刷新。


使用本机查询的增量刷新

如果你配置了本机查询,是否仍可配置并使用增量刷新取决于你的数据源。 若要自行尝试,请用以下步骤替换上面的步骤 4:

  1. 编写并保存本机查询: 在 SQL Server Management Studio 或 Azure Data Studio 中编写本机查询。 包含一个占位符 WHERE 子句,其中使用一个 DateTime 参数筛选 >=,并使用另一个 DateTime 参数筛选 <。

    刷新所有分区incremental-refresh-native-query-formatted.png

  2. 在源表达式中替换本机查询字符串: 复制该查询并替换现有查询;现有查询通常会充满诸如 (lf)(换行符)、(cr)(回车符)和 (n)(换行符)之类的字符。 这样可以让查询真正变得易读、可编辑,而不必借助 Power BI Desktop 的“本机查询”界面。

Refresh All Partitions

例如,将 Query 参数中的上述文本替换为下面的内容:

Refresh All Partitions
  1. 添加 RangeStartRangeEndWHERE 子句中拼接 "RangeStart" 和 "RangeEnd",替换占位字段,并使用 Date.From 将参数转换为日期,再通过 Date.ToTextFormat 选项设为 "yyyy-MM-dd,把它们转换为字符串数据类型。 别忘了在拼接结果两侧加上单引号 '。 下面是最终查询的示例:
// 支持查询折叠并可用于增量刷新的完整本机查询示例
let
    Source = Sql.Database("yoursql.database.windows.net", "YourDatabaseName", 
    [Query="

SELECT
    [OrderDateKey]
   ,[DueDateKey]
   ,SUM([OrderQuantity]) AS 'TotalOrderQuantity'
   ,SUM([SalesAmount]  ) AS 'TotalSalesAmount'
   ,[CustomerKey]
   ,[ProductKey]
FROM [DW_fact].[Internet Sales]
WHERE
   CONVERT(DATE, CONVERT(VARCHAR(8), [OrderDateKey])) 
   >= CONVERT(DATE, '" & Date.ToText(Date.From(#"RangeStart"), [Format="yyyy-MM-dd"]) & "')
   AND
   CONVERT(DATE, CONVERT(VARCHAR(8), [OrderDateKey])) 
   < CONVERT(DATE, '" & Date.ToText(Date.From(#"RangeEnd"), [Format="yyyy-MM-dd"]) & "')
GROUP BY
    [OrderDateKey]
   ,[DueDateKey]
   ,[CustomerKey]
   ,[ProductKey]

"])
in
   Source
  1. 验证新的 M 表达式: 在启用刷新策略之前,你可以先尝试保存对表的 M 表达式所做的更改,看看当你将 RangeStartRangeEnd 设为特定值时,是否能得到预期结果。 如果是这样,你就可以按正常流程继续;只要你在 Power Query 中正确配置了这些步骤,Power BI 就能按预期处理分区。

    这可能不是必需的,但根据本机查询中的转换情况,你也可以尝试按 Chris Webb 的这篇文章所述,添加参数 [EnableFolding = True]

  2. 按正常流程继续后续步骤: 然后你就可以用 'Apply refresh policy' 配置并应用刷新策略,最后刷新所有分区。 刷新操作完成后,预览该表的数据以查看结果。