sql - OLEDB 源任务是否将所有行传递给 OLE DB 命令任务,并且 OLE DB 命令任务一次处理一条记录?

标签 sql sql-server ssis etl oledbcommand

我有一个包含 2 个组件的数据流任务:

  1. 属于 SELECT 查询的 OLEDB 数据源任务:
SELECT ACCOUNTID
FROM JOBS
WHERE STATUS=3
  • OLE DB 命令任务执行以下操作:
  • DELETE FROM ACCOUNT
    WHERE ACCOUNTID=?
    

    逻辑是任何状态 ID 为 3 的作业都必须导致从帐户表中删除 accountid。

    我知道,当步骤 1 返回多个记录时,步骤 2 执行速度很慢,因为它是在每个记录上发生的操作。就好像我已将步骤 1 中的数据暂存在一个单独的表中,然后在执行 sql 任务中基于暂存表触发删除,那么速度会更快。

    由于返回的行数始终很小(低于 20),因此我使用 OLE DB 命令任务方法。我的问题是 -

    1. OLEDB 源任务是否将每一行传递到 OLE DB 命令任务中,从而导致 OLEDB 命令任务一次处理一条记录?

    或者OLEDB源任务是否将所有行传递给OLE DB命令任务,并且OLE DB命令任务一次处理一条记录?

  • OLEDB 源任务提取行后,它们在传递到 OLE DB 命令任务之前保存在哪里?

  • 在 OLE DB Command 任务完成之前,OLEDB Source 任务生成的行是否被锁定?

  • 最佳答案

    第一个问题

    Does the OLEDB source task pass each row into the OLE DB Command task, thereby resulting in the OLEDB Command task processing one record at a time? Or Does the OLEDB source task pass all the rows to the OLE DB Command task, and the OLE DB Command task processes one record at a time?

    OLE DB 源从 SQL 数据库中提取数据并将它们存储在内存缓冲区中。有几个因素会影响数据加载到 SSIS 中的方式:

    1. 提取的数据行数
    2. 每行存储的数据量
    3. DefaultBufferMaxRowsDefaultBufferSize 数据流任务的 properties values

    enter image description here

    另一方面,OLE DB 命令按 mentioned in the official documentation 逐行处理数据。 :

    The OLE DB Command transformation runs an SQL statement for each row in a data flow.

    第二个问题

    Until the completion of the OLE DB Command task, are the rows produced by the OLEDB Source task locked?

    如前所述,数据在内存缓冲区内传输。一旦 OLE DB 命令处理的行数和大小满足数据流任务的缓冲区配置,它们就会被发送到下一个组件。当然,这比从 OLE DB 源提取数据要慢,因为数据是逐行处理的。

    enter image description here

    此外,在处理数据时,OLE DB 命令不会从 OLE DB 源接收任何新数据。它与排序转换不同。它只接收一个缓冲区,对其进行处理,然后通过输出发送它,而不是将所有数据存储在内存中并进行处理。

    下面的屏幕截图显示了 OLE DB 组件在结束处理当前数据缓冲区之前如何不接收新的数据缓冲区(在此示例中,我在没有索引的大表上使用更新语句):

    enter image description here


    有用的资源

    关于sql - OLEDB 源任务是否将所有行传递给 OLE DB 命令任务,并且 OLE DB 命令任务一次处理一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70925810/

    相关文章:

    sql - 检查列值是否为零 MS SQL Server

    json - 使用 ConvertTo-Json 转换为 JSON 时保留数据类型名称

    SSIS 条件拆分 NULL

    Grails 中的 SQL/数据库 View

    mysql - 如何在 WHERE 中使用 Alias 并与 LIMIT 进行操作

    sql-server - sql选择查询问题

    c# - 将空值插入 SQL Server 数据库

    sql - MySQL 如何处理 WHERE 测试?

    sql 双向连接

    sql-server - 将错误数据移到另一个表