Oracle 到 Postgres Table 加载使用 SSIS 加载性能改进建议?
Oracle to Postgres Table load using SSIS load performance improvement suggestions?
我正在尝试使用 SSIS 将 table 从 Oracle 加载到 Postgres,其中包含约 2 亿条记录。 Oracle、Postgres 和 SSIS 在不同的服务器上。
正在从 Oracle 读取数据
为了从 Oracle 数据库中读取数据,我使用了使用“Oracle Provider for OLE DB”的 OLE DB 连接。 OLE DB 源配置为使用 SQL 命令读取数据。
总共有 44 个列,主要是 varchar,11 个数字和 3 个时间戳。
正在将数据加载到 Postgres
为了将数据导入 Postgres,我使用了 ODBC 连接。 ODBC 目标组件配置为以批处理模式加载数据 (不是 row-by-row 插入).
SSIS 配置
我创建了一个 SSIS 包,它只包含一个简单的 数据流任务。
问题
负载似乎需要很多小时才能达到一百万次。在 SQL 开发人员中执行时,源查询会快速给出结果。但是当我尝试导出时它抛出了超出限制的错误。
在 SSIS 中,当我尝试预览 Source SQL 命令的结果时,它返回:The system cannot find message text for message number 0x80040e51 in the message file for OraOLEDB. (OraOLEDB)
注意到源(SQL 命令)和目标 table 没有任何索引。
能否请您提出任何提高加载性能的方法?
我会尝试提供一些技巧来帮助您提高包的性能。您应该开始系统地对您的软件包进行故障排除以找出性能瓶颈。
一些提供的链接与 SQL 服务器相关。不用担心!所有数据库管理系统都应用相同的规则。
1。可用资源
首先,您应该确保您有足够的资源将数据从源服务器加载到目标服务器。
确保源、ETL 和目标服务器上的可用内存可以处理您尝试加载的数据量。此外,请确保您的网络连接带宽不会降低数据传输性能。
确保任何服务器中都没有发生以下硬件问题:
- 驱动器存储空间不足
- 服务器内存不足
确保您的机器没有 运行 内存不足。您可以简单地使用任务管理器来确定可用内存量。
2。数据源
确保 table 不是堆
检查可用资源后,您应确保您的数据源不是堆。至少如果你在 table.
上创建了一个主键会更好
索引
如果您的 SQL 命令包含任何过滤、排序或连接,您应该创建这些操作所需的索引。
- Use WHERE, JOIN, ORDER BY, SELECT Column Order When Creating Indexes
- Is the WHERE-JOIN-ORDER-(SELECT) rule for index column order wrong?
OLE DB 提供程序
尝试使用 Microsoft Connector for Oracle (以前称为 Attunity 连接器),而不是使用 OLE DB 源连接到 Oracle。 Microsoft 之前提到它应该提供比传统 OLE DB 提供程序更快的性能。
使用 Oracle connection manager 而不是 OLE DB 连接管理器。
老实说,我不确定这个组件是否可以使数据加载更快,因为我之前没有测试过
删除目标并添加虚拟任务
最后要尝试的是删除 ODBC 目标并添加任何虚拟任务。例如,使用行计数组件。
运行 包裹;如果数据加载速度更快,那么从 Oracle 加载数据不会降低性能。
3。 SSIS 配置
现在,让我们开始对 SSIS 包进行故障排除。
运行宁在 64 位模式下
首先,尝试在 64 位模式下执行程序包。您可以从包配置中更改它。确保 Run64bitRuntime
属性 设置为 True
.
数据流任务缓冲区size/limits
使用 SSIS,数据在从源传输到目标的同时加载到内存中。数据流任务中有两个属性指定在 SSIS 管道使用的内存缓冲区中传输了多少数据。
基于以下 Integration Services performance tuning white paper:
DefaultMaxBufferRows – DefaultMaxBufferRows is a configurable setting of the SSIS Data Flow task that is automatically set at 10,000 records. SSIS multiplies the Estimated Row Size by the DefaultMaxBufferRows to get a rough sense of your dataset size per 10,000 records. You should not configure this setting without understanding how it relates to DefaultMaxBufferSize.
DefaultMaxBufferSize – DefaultMaxBufferSize is another configurable setting of the SSIS Data Flow task. The DefaultMaxBufferSize is automatically set to 10 MB by default. As you configure this setting, keep in mind that its upper bound is constrained by an internal SSIS parameter called MaxBufferSize which is set to 100 MB and can not be changed.
您应该尝试更改这些值并在每次更改它们时测试您的包性能,直到包性能提高。
4。目的地
Indexes/Triggers/Constraints
您应该确保目标 table 没有任何约束或触发器,因为它们会显着降低数据加载性能;插入的每个批次都应在存储之前进行验证或预处理。
- Are SQL Server database triggers evil?
- The benefits, costs, and documentation of database constraints
此外,索引越多,数据加载性能越低。
ODBC 目标自定义属性
ODBC 目标有 several custom properties 会影响数据加载性能,例如 BatchSize
(每批行数)、TransactionSize
(TransactionSize 仅在高级编辑器中可用).
我正在尝试使用 SSIS 将 table 从 Oracle 加载到 Postgres,其中包含约 2 亿条记录。 Oracle、Postgres 和 SSIS 在不同的服务器上。
正在从 Oracle 读取数据
为了从 Oracle 数据库中读取数据,我使用了使用“Oracle Provider for OLE DB”的 OLE DB 连接。 OLE DB 源配置为使用 SQL 命令读取数据。
总共有 44 个列,主要是 varchar,11 个数字和 3 个时间戳。
正在将数据加载到 Postgres
为了将数据导入 Postgres,我使用了 ODBC 连接。 ODBC 目标组件配置为以批处理模式加载数据 (不是 row-by-row 插入).
SSIS 配置
我创建了一个 SSIS 包,它只包含一个简单的 数据流任务。
问题
负载似乎需要很多小时才能达到一百万次。在 SQL 开发人员中执行时,源查询会快速给出结果。但是当我尝试导出时它抛出了超出限制的错误。
在 SSIS 中,当我尝试预览 Source SQL 命令的结果时,它返回:The system cannot find message text for message number 0x80040e51 in the message file for OraOLEDB. (OraOLEDB)
注意到源(SQL 命令)和目标 table 没有任何索引。
能否请您提出任何提高加载性能的方法?
我会尝试提供一些技巧来帮助您提高包的性能。您应该开始系统地对您的软件包进行故障排除以找出性能瓶颈。
一些提供的链接与 SQL 服务器相关。不用担心!所有数据库管理系统都应用相同的规则。
1。可用资源
首先,您应该确保您有足够的资源将数据从源服务器加载到目标服务器。
确保源、ETL 和目标服务器上的可用内存可以处理您尝试加载的数据量。此外,请确保您的网络连接带宽不会降低数据传输性能。
确保任何服务器中都没有发生以下硬件问题:
- 驱动器存储空间不足
- 服务器内存不足
确保您的机器没有 运行 内存不足。您可以简单地使用任务管理器来确定可用内存量。
2。数据源
确保 table 不是堆
检查可用资源后,您应确保您的数据源不是堆。至少如果你在 table.
上创建了一个主键会更好索引
如果您的 SQL 命令包含任何过滤、排序或连接,您应该创建这些操作所需的索引。
- Use WHERE, JOIN, ORDER BY, SELECT Column Order When Creating Indexes
- Is the WHERE-JOIN-ORDER-(SELECT) rule for index column order wrong?
OLE DB 提供程序
尝试使用 Microsoft Connector for Oracle (以前称为 Attunity 连接器),而不是使用 OLE DB 源连接到 Oracle。 Microsoft 之前提到它应该提供比传统 OLE DB 提供程序更快的性能。
使用 Oracle connection manager 而不是 OLE DB 连接管理器。
老实说,我不确定这个组件是否可以使数据加载更快,因为我之前没有测试过
删除目标并添加虚拟任务
最后要尝试的是删除 ODBC 目标并添加任何虚拟任务。例如,使用行计数组件。
运行 包裹;如果数据加载速度更快,那么从 Oracle 加载数据不会降低性能。
3。 SSIS 配置
现在,让我们开始对 SSIS 包进行故障排除。
运行宁在 64 位模式下
首先,尝试在 64 位模式下执行程序包。您可以从包配置中更改它。确保 Run64bitRuntime
属性 设置为 True
.
数据流任务缓冲区size/limits
使用 SSIS,数据在从源传输到目标的同时加载到内存中。数据流任务中有两个属性指定在 SSIS 管道使用的内存缓冲区中传输了多少数据。
基于以下 Integration Services performance tuning white paper:
DefaultMaxBufferRows – DefaultMaxBufferRows is a configurable setting of the SSIS Data Flow task that is automatically set at 10,000 records. SSIS multiplies the Estimated Row Size by the DefaultMaxBufferRows to get a rough sense of your dataset size per 10,000 records. You should not configure this setting without understanding how it relates to DefaultMaxBufferSize.
DefaultMaxBufferSize – DefaultMaxBufferSize is another configurable setting of the SSIS Data Flow task. The DefaultMaxBufferSize is automatically set to 10 MB by default. As you configure this setting, keep in mind that its upper bound is constrained by an internal SSIS parameter called MaxBufferSize which is set to 100 MB and can not be changed.
您应该尝试更改这些值并在每次更改它们时测试您的包性能,直到包性能提高。
4。目的地
Indexes/Triggers/Constraints
您应该确保目标 table 没有任何约束或触发器,因为它们会显着降低数据加载性能;插入的每个批次都应在存储之前进行验证或预处理。
- Are SQL Server database triggers evil?
- The benefits, costs, and documentation of database constraints
此外,索引越多,数据加载性能越低。
ODBC 目标自定义属性
ODBC 目标有 several custom properties 会影响数据加载性能,例如 BatchSize
(每批行数)、TransactionSize
(TransactionSize 仅在高级编辑器中可用).