SQL Datawarehousing,需要帮助使用TSQL SELECT填充我的DIMENSION或更好的替代方案吗?

时间:2012-09-30 00:29:04

标签: sql tsql ssis data-warehouse dimensions

我的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.

1 个答案:

答案 0 :(得分:1)

我首先将其拆分为两个操作:生成代理键并填充维度表。第一步将只有3列DISTINCT,第二步将成为JOIN。对两个操作中使用的列建立索引可能会给您一些改进。

您可以将DISTINCTNOT 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版本或版本。