【发布时间】:2014-12-25 15:26:57
【问题描述】:
我试图为 SSIS 查找组件找到一些性能良好的 Tsql 等效项。特别是对于事实表加载。
在几种不同的查询模式之后,obv 表现最好:
INSERT INTO Fact WITH (TABLOCK)
SELECT
F.Attribute1,
...
d1.DimAId,
d2.DimBId,
d3.DimCId,
...
F.Amount
...
from Staging.dbo.GeneralLedger F WITH(NOLOCK)
LEFT OUTER JOIN DimA1 d1 WITH(NOLOCK)
on d1.AId = F.AId
LEFT OUTER JOIN DimB d2 WITH(NOLOCK)
on d2.BId = F.BId
LEFT OUTER JOIN DimC d3 WITH(NOLOCK)
on d3.CId = F.CId
性能方面,我用 500 万行和 9 个维度的查找对此进行了测试。
SSIS:1 分 14 秒 TSQL:1m0s
如果我在更大的数据集(+100M 行)上选择 TSQL 而不是 SSIS 会有什么影响 目前我在一个 200GB RAM 的服务器上进行了测试,所以将所有内容都放入内存中没有问题。
但是我想如果在内存较少的机器上使用此查询,它将开始溢出到磁盘并严重损害性能。 SSIS 会在内存方面更有效率。我对这个假设是否正确?
我想到的另一个想法是使用游标循环仅使用 tsql 执行此操作,例如在加载所有数据之前为 1M 行。通过这样做,您将有更少的机会获得内存并开始浪费到磁盘。这是一种可行的方法吗?还是看看你有什么其他方法?
PS:我完全知道 SSIS 是加载事实表的方法。但是让我们假设我们只需要 TSQL。
【问题讨论】:
标签: sql sql-server tsql ssis