我有一个SSIS ETL包,它将CSV文件加载到具有100多列会计数据的临时表中,我们正在根据这些数据创建一个数据仓库。
从100多列数据中,我们可以确定创建“产品”维度所需的列...
示例数据..
product_id,product_name,product_description
'1','computer','power pc'
'2','case','atx case'
'1','computer','power pc'
'3','cpu'intel'
'3','cpu'intel'
所以,我所做的是创建了一个DIM.PRODUCT表,即......
CREATE TABLE DIM.OFFICE (
"product_key" int IDENTITY (1,1) NOT NULL, -- Surrogate Key
"product_id" varchar(150) NOT NULL, -- Business Key
"product_name" varchar(150) NOT NULL,
"product_Description" varchar(150) NOT NULL,
)
我们知道示例数据中的“产品ID”唯一标识产品,因此产品ID#1将始终具有product_name = computer,product_description = power pc。
登台表有300万条记录,如何从登台表填充我的维度,以便以后我可以在填充事实表时查找。
维度是类型1维度,产品ID#1将始终为“计算机”,“power pc”。
以前我一直在使用SELECT DISTINCT“product id”,“product_name”,“product_description”来仅从登台表中获取不同的值,并将其加载到维度中,但我发现这种方法对于填充维度时的资源系统。
有更好,更有效(表现明智)的方式吗? (使用TSQL或SSIS)..
我们正在运行SQL 2008 SP3 ..计划很快升级到SQL 2012。
答案 0 :(得分:1)
选择不同的通常需要执行排序,这实际上是完成所有工作的地方。 (您可以通过查看查询计划来验证这一点)。您可以通过以下几种方式对其进行优化:
通过创建聚簇索引,确保数据已经按所需顺序进行物理排序。这个'预先排序'数据,但是当然现在当您导入数据时,您必须在运行时对其进行预先排序,因此现在这会减慢导入到临时表的速度。如果导入>分段可能需要一些时间但尺寸加载不得,则这可能是实用的。
通过确保TempDB运行良好来优化您的数据库排序。
两者都是DBA类型的问题。你有DBA吗?
答案 1 :(得分:0)
假设SSIS和SQL不争用相同的资源,您可以考虑附加
查询OPTION (FAST 10000)
这有可能导致SQL Server上的非阻塞查询计划 - 哈希匹配,而不是DISTINCT的排序。尽管SQL查询本身可能运行得更长,但整个处理可能会加快,因为SSIS可以并行处理流。最终结果可能是相当大的加速。
答案 2 :(得分:0)
维度表来自事实表,可能是设计问题。应在您的在线系统中创建产品暗淡
SELECT DISTINCT
是目前最好的选择。也许您可以尝试通过product_id