Ove*_*ack 5 data-warehouse sql-server ssis t-sql
我试图为 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
Run Code Online (Sandbox Code Playgroud)
性能方面,我用 500 万行和 9 个维度的查找对此进行了测试。
SSIS:1 分 14 秒 TSQL:1 分 14 秒
如果我在更大的数据集(+100M 行)上选择 TSQL 而不是 SSIS,这将是什么意思 目前我在 200GB RAM 服务器上测试了这个,所以在内存中安装所有内容都没有问题。
但是我想如果这个查询将在内存较少的机器上使用,它将开始溢出到磁盘并严重损害性能。SSIS 会在内存方面更有效率。我对这个假设是否正确?
我想到的另一个想法是使用游标循环仅使用 tsql 执行此操作,例如在加载所有数据之前对 1M 行执行此操作。通过这样做,您将减少内存不足并开始浪费到磁盘的机会。这是一种可行的方法还是其他方法?
PS:我完全知道 SSIS 是加载事实表的方法。然而,让我们假设我们只想要 TSQL。PS2:问题也发布在 stackoverflow /sf/ask/1864701331/ 上。然而,没有真正的开创性回应。
将大型数据集批处理为较小的数据集(例如 100,000 行或 1,000,000 行)将使负载运行得比 One Big Insert 更好。当然,SSIS 也是如此,因为它批量插入。
您在示例中显示的时间差异相当小。这并没有给速度带来很大的提高,但它确实鼓励您知道可以使用其他方法进行导入。
编辑如下。
如果您愿意首先提取到 .csv 文件,也许可以使用 BCP 从视图提取到 .csv 文件。然后您可以使用BULK INSERT
将该文件加载到数据库中:
BULK INSERT
描述:http ://msdn.microsoft.com/en-us/library/ms188365.aspx
如果您想在 TSQL 中进行全部导入,那么您可以使用该BULK INSERT
命令。当你查看它的参数时,你会发现它包含 KILOBYTES_PER_BATCH
和ROWS_PER_BATCH
作为控制批量大小的方法。
由于BCP
和的速度BULK INSERT
,以及批量大小的控制,我相信这将是更快的使用方法之一。但它确实需要中间 .csv 文件。
其他问题:您的数据是来自同一台服务器,还是来自另一台服务器?如果是同一台服务器,那么访问就相当东了。如果另一台服务器并且您不需要中间 .csv 文件,您可以创建一个链接服务器来查询另一台服务器的数据。
但是,正如您所指出的,这意味着您必须自己管理批次。这类似于您所描述的“光标循环”,尽管它可能不需要光标,只是一个选择要复制的下一个“n”行的循环。如果数据位于另一台服务器上,则此方法的开销会更高。
归档时间: |
|
查看次数: |
2437 次 |
最近记录: |