admin

SQL Datawarehousing,是否需要使用TSQL SELECT或更好的替代方法来填充我的DIMENSION的帮助?

sql

我在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

它产生与以下结果相同的结果:

SELECT DISTINCT
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city"
FROM DBO.DWUSD_LIVE

有没有更好的方法来执行此TSQL QUERY?我需要所有列,但只需要业务键列上的DISTINCT。

感谢您的帮助。

下图显示了如何在SSIS中设置我的项目,Dimensions是SCD 1。


阅读 189

收藏
2021-07-01

共1个答案

admin

我首先将其分为两个操作:生成代理键和填充维表。第一步将DISTINCT只有3列,而第二步将变为JOIN。索引这两个操作中使用的列可能会给您带来一些改进。

您可以将DISTINCT与结合使用,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版本。

2021-07-01