Azure Analysis Service如何仅刷新模型中修改的历史行而非全量刷新?
可以实现,具体方案分两种场景选择:
场景一:修改行集中在少量历史分区
如果被修改的行集中在少数几个按日划分的历史分区里,推荐用分区替换刷新的方式,步骤如下:
- 通过SQL查询定位修改行所在的分区:
- 编写SQL语句,根据
last_modified_time筛选出所有被修改的行,同时关联业务日期(你的分区键),得到需要更新的分区日期列表。
示例SQL:
SELECT DISTINCT CONVERT(VARCHAR(8), business_date, 112) AS partition_date FROM your_fact_table WHERE last_modified_time > @last_refresh_time -- 上次刷新后的修改行 - 编写SQL语句,根据
- 在SSAS表格模型中,针对每个需要更新的分区执行分区级别的替换刷新:
- 可以通过SSMS手动操作:找到对应分区,右键选择“刷新”,刷新类型选“替换”;
- 也可以用TMSL脚本批量执行,示例脚本:
这种方式会重新执行该分区的数据源查询,拉取该分区的最新数据(包含修改后的行),替换原有分区数据,比全量刷新模型高效得多。{ "refresh": { "type": "replace", "objects": [ { "database": "YourTabularModelDB", "table": "YourFactTable", "partition": "Partition_20200101" -- 替换为实际分区名 } ] } }
场景二:修改行零散分布在大量分区(单条/少量行修改)
如果修改的行数量极少且分散在多个分区,推荐用先删后加的精细化操作,步骤如下:
- 提取修改行的主键和最新数据:
- 用SQL查询出所有被修改行的主键(比如
fact_id)以及完整的最新行数据,保存为临时表或CSV文件。
示例SQL:
SELECT fact_id, col1, col2, ..., business_date FROM your_fact_table WHERE last_modified_time > @last_refresh_time - 用SQL查询出所有被修改行的主键(比如
- 删除SSAS模型中对应的旧行:
- 用TMSL脚本执行删除操作,根据主键匹配删除,示例:
{ "delete": { "object": { "database": "YourTabularModelDB", "table": "YourFactTable" }, "where": "fact_id IN (123, 456, 789)" -- 替换为实际主键列表 } } - 插入修改后的新行:
- 将步骤1中获取的最新数据,通过
ProcessAdd方式加载到对应分区(根据业务日期匹配分区),可以用TMSL脚本或SSIS包实现批量插入。
- 将步骤1中获取的最新数据,通过
注意事项
- 无论哪种方案,都要确保
last_modified_time字段的准确性,避免遗漏或误判修改行; - 执行分区刷新或先删后加操作时,建议在业务低峰期进行,避免影响模型查询性能;
- 批量操作时,优先用TMSL脚本或PowerShell自动化执行,减少手动操作的误差。
内容的提问来源于stack exchange,提问作者Jess8766
相关产品推荐
相关产品推荐

