1

我有一个 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”唯一标识了产品,因此#1 的产品 id 将始终具有 product_name = computer,product_description = power pc。

暂存表有 300 万条记录,我如何从暂存表中填充我的维度,以便稍后在填充事实表时查找它。

维度是类型 1 维度,产品 id #1 将始终为“computer”、“power pc”。

以前我一直在使用 SELECT DISTINCT "product id","product_name","product_description" 来仅从临时表中获取不同的值,并将其加载到维度中,但我发现这种方法会对资源系统征税填充尺寸时。

有没有更好、更有效(性能方面)的方法来做到这一点?(使用 TSQL 或 SSIS)..

我们正在运行 SQL 2008 SP3.. 并计划很快升级到 SQL 2012。

4

3 回答 3

1

select distinct通常需要执行排序,这实际上是所有工作完成的地方。(您可以通过查看查询计划来验证这一点)。您可以通过以下几种方式对其进行优化:

  1. 通过创建聚集索引,确保数据已按所需顺序进行物理排序。这对数据进行了“预排序”,但当然现在当您导入数据时,您必须即时对其进行预排序,因此现在这会减慢导入临时表的速度。如果 import>staging 可能需要一些时间但维度加载不能,这可能是实用的。

  2. 通过确保 TempDB 运行良好来优化您的数据库排序功能。

两者都是真正的 DBA 类型的问题。你有DBA吗?

于 2013-03-14T06:23:50.050 回答
0
  1. 维度表来自事实表,可能是设计问题。product dim 应在您的在线系统中创建

  2. SELECT DISTINCT是目前最好的选择。也许您可以尝试通过 product_id 将 CSV 加载到哈希分区表分区中

于 2013-04-03T01:36:21.577 回答
0

假设 SSIS 和 SQL 不会争夺相同的资源,您可以考虑追加
OPTION (FAST 10000)到查询中。
这往往会导致 SQL Server 上的非阻塞查询计划 - 哈希匹配,而不是 DISTINCT 排序。虽然 SQL 查询本身可能会运行更长时间,但作为一个整体的处理可能会加快,因为 SSIS 可以并行处理流。最终结果可能是相当大的加速。

于 2013-03-14T21:06:36.747 回答