Sql server 提高大型数据集的SSIS包插入/删除速度(或者这可以吗?)

Sql server 提高大型数据集的SSIS包插入/删除速度(或者这可以吗?),sql-server,csv,ssis,data-migration,batch-insert,Sql Server,Csv,Ssis,Data Migration,Batch Insert,我是SSIS的新手,我们有一个客户需要处理相当大的数据集 一个表有超过1.9亿行。每个月他们都会用CSV文件(大约40GB大小)中的数据替换这些数据。这是作为SSIS包中的一个步骤完成的 现在,他们只想在某个日期(CSV文件中最小的日期)后替换数据,因此,他们只发送2010年及以后的数据,而不是从1997年开始一直发送数据。我们的做法是: 截断“临时表”(SQL语句任务) 从“data.csv”(平面文件源)读取所有数据 多播 将所有数据插入“临时表”(OLE DB目标) 这是以每批75k行

我是SSIS的新手,我们有一个客户需要处理相当大的数据集

一个表有超过1.9亿行。每个月他们都会用CSV文件(大约40GB大小)中的数据替换这些数据。这是作为SSIS包中的一个步骤完成的

现在,他们只想在某个日期(CSV文件中最小的日期)后替换数据,因此,他们只发送2010年及以后的数据,而不是从1997年开始一直发送数据。我们的做法是:

  • 截断“临时表”(SQL语句任务)
  • 从“data.csv”(平面文件源)读取所有数据
    • 多播
    • 将所有数据插入“临时表”(OLE DB目标)
      • 这是以每批75k行为一批完成的
    • 将变量“minDate”设置为“data.csv”(脚本组件)中的最小日期值
  • 删除“destination_table”中日期值大于“minDate”(SQL语句任务)的所有行
    • 这是以每批10万行为一批完成的
  • 插入从“临时表”到“目标表”的所有行(OLE DB源->OLE DB目标)
    • 这是以每批75k行为一批完成的
  • 使用这种方法,我们以每秒60k行的平均速率向“temp_表”插入数据

    “destination_table”中的删除阶段每秒删除约40k行,第二个插入阶段(从“temp_table”到“destination_table”)以每秒约80k行的速度运行

    这种工作的平均速度是多少?是不是太慢了?您将如何改进它?

    TL;DR


    我们正在使用SSIS以每分钟约400-500万行的速率向MSSQL数据库表插入数据,并以每分钟约250万行的速率删除数据。这可以接受吗?

    行/秒平均值取决于每种情况。 要知道这是否足够,我们必须知道最终表是如何配置的,哪些是数据库服务器的硬件配置

    为了提高性能,我们总是首先看到I/O。如果我们可以在写入或读取中执行某些操作

    在书面上,我们可以这样做: 使用名为“平衡数据分发器”的SSIS组件,该组件利用处理器的能力并行写入数据。 将表分区为多个磁盘,以便同时写入数据

    在read中,您可以将文件划分为多个文件以同时读取


    我不知道我是否帮了你。。。但这就是我的想法。

    那么[CSV]==(所有行)=>[条件分割(按日期)]==(匹配行)=>[OLEDB目的地]?@Tomalak感谢您的输入!问题是这些行将不会以任何方式匹配。它是“未知”数据,没有任何标识符,50列可能与最后一个插入点不同。在上个月的数据集中,可能有5000行的列“reference”设置为“abc123”,而在这个月的数据集中,只有300行。。。最终的结果是,最终的表应该只有300行,“reference”设置为“abc123”。
    是否太慢?
    数据刷新过程的SLA是什么?在加载临时表时,我可以想到两种优化方法。第一个是用本机聚合任务替换脚本任务。但只有当你觉得你必须抓住其中的价值时,你才会这么做。我倾向于将所有数据加载到表中。然后,我将添加一个executesql任务来查找最小插入日期。测试,看看哪个更快。如果实例上有临时表和目标,请跳过所有这些,只需编写要删除和插入的SQL,并将其放入执行SQL任务中。如果您想获得更好的调优思路,请向我们展示源文件定义、临时表和最终目标表结构、平面文件连接管理器的列定义。一个数据样本不会有什么坏处,我们可以在这里做一些技巧。当软件包运行时,它在等待什么(磁盘、内存、cpu、网络)?您使用的是哪个版本的SQL Server?标准或企业版?如果要从特定日期删除所有行,请考虑使用分区。删除分区和截断分区一样快。这是一个企业特性。