在慢速维度更新期间更新计算的派生列的最佳方法是什么?

时间:2014-11-04 16:38:21

标签: sql-server ssis sql-server-2012 nested-sets

我正在开发一个SSIS项目来构建数据仓库。

这是我为加载维度表(Locations)而构建的简单SSIS流程。 位置表包含基于嵌套集(LEFT,RIGHT,LEVEL字段)的父/子结构。 因此,插入过程和更新过程一样。

enter image description here

但是,我需要填充计算列(PARENT_ID)以存储父关系。 因此,对于每一行,我需要在SQL语句中使用(LEFT,RIGHT和LEVEL列)来查找PARENT_ID值。

这是源表的表结构: enter image description here

那么在加载过程中填充parent_id列的最佳方法是什么? 我应该为此流程构建专用数据流吗?

我可以在Derived列组件中使用SQL语句来查找parent_id值吗?

编辑:这是我的SQL查询,用于更新我的父/子结构(parent_id字段)。

UPDATE 
    L1
    SET L1.[PARENT_ID] = (
    SELECT TOP 1 L2.ID
           FROM [DW].[DimLocation] L2
           WHERE L2.[TREE_LEFT_VALUE] < L1.[TREE_LEFT_VALUE] AND L2.[TREE_RIGHT_VALUE] > L1.[TREE_RIGHT_VALUE]    
           ORDER BY L2.[TREE_RIGHT_VALUE]-L1.[TREE_RIGHT_VALUE] ASC)
FROM [DW].[DimLocation] L1
WHERE [TREE_LEFT_VALUE] > 1

编辑2 :这是一个表示嵌套集结构以及如何在数据库中表示它的图表。 enter image description here enter image description here

因此,每个节点都包含TREE_LEFT_VALUETREE_RIGHT_VALUE个值,这些值分别绑定了其子级TREE_LEFT_VALUE / TREE_RIGHT_VALUE值。

它在一个简单的查询中查找指定节点的所有子节点。例如,如果我想要&#34; ROOT 1&#34;的所有孩子。节点,我需要查询TREE_LEFT_VALUE大于2且TREE_RIGHT_VALUE小于5的所有节点。

因为我需要在我的数据仓库中使用parent_id结构(SSAS项目来构建OLAP多维数据集),所以我需要通过添加父节点ID来更新PARENT_ID字段。因此,我需要使用TREE_LEFT_VALUETREE_RIGHT_VALUE字段查询父节点ID,然后在更新语句中使用结果。

它工作正常,但是有更有效的方法吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

如果列可以为空,我会在数据流后用SQL任务更新它。这将确保在您尝试查找parentid之前插入所有可能的父行 - 此外,它将保持基于进程集,而不是尝试在数据流任务中进行查找。