我在SQL Server中有一个表,在这里“暂存”从ERP系统中提取的数据仓库。
通过此登台表( 表名称:DBO.DWUSD_LIVE ),我构建了维度并加载了事实数据。
DIMENSION表的示例称为“ SHIPTO”,此维具有以下列:
"shipto_id "shipto" "salpha" "ssalpha" "shipto address" "shipto name" "shipto city"
现在,我有一个SSIS包,它对上述各列执行SELECT DISTINCT来检索“唯一”数据,然后通过SSIS包将“ shipto_id”代理键分配给它。
我当前的TSQL查询的一个示例是:
SELECT DISTINCT "shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city" FROM DBO.DWUSD_LIVE
这很好用,但不是“快速”的,某些尺寸有10列,对它们进行不同的选择并不理想。
在此维度中,我的“业务密钥” 列为“ SHIPTO”,“ SALPHA”和“ SSALPHA” 。
因此,如果我这样做:
SELECT DISTINCT "shipto", "salpha", "ssalpha" FROM DBO.DWUSD_LIVE
它产生与以下结果相同的结果:
有没有更好的方法来执行此TSQL QUERY?我需要所有列,但只需要业务键列上的DISTINCT。
感谢您的帮助。
下图显示了如何在SSIS中设置我的项目,Dimensions是SCD 1。
我首先将其分为两个操作:生成代理键和填充维表。第一步将DISTINCT只有3列,而第二步将变为JOIN。索引这两个操作中使用的列可能会给您带来一些改进。
DISTINCT
JOIN
您可以将DISTINCT与结合使用,NOT EXISTS以避免处理已经被映射的行,如下所示:
NOT EXISTS
insert into dbo.KeyMappingTable (shipto, salpha, ssalpha) select distinct shipto, salpha, ssalpha from dbo.Source where not exists ( select * from dbo.KeyMappingTable where shipto = dbo.Source.shipto and salpha = dbo.Source.salpha and ssalpha = dbo.Source.ssalpha )
然后便有了映射,因此您可以执行以下操作:
insert into dbo.DimShipTo (shipto_id, shipto /*, etc. */) select m.shipto_id, s.shipto -- etc. from dbo.KeyMappingTable m join dbo.Source s on m.shipto = s.shipto and m.salpha = s.salpha and m.ssalpha = s.ssalpha where not exists ( select * from dbo.DimShipTo where shipto_id = m.shipto_id )
您还应该查看MERGE,如果您使用的是Type 1维度,并且只想在地址或其他属性更改时更新地址(这通常是一个有用的命令),这将很方便。但是它只能在SQL Server 2008中使用。您没有提到要使用的SQL Server版本。
MERGE