我的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.
答案 0 :(得分:1)
我首先将其拆分为两个操作:生成代理键并填充维度表。第一步将只有3列DISTINCT
,第二步将成为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版本或版本。