【问题标题】:SSIS performance vs OpenQuery with Linked Server from SQL Server to OracleSSIS 性能与使用从 SQL Server 到 Oracle 的链接服务器的 OpenQuery
【发布时间】:2019-08-19 15:50:57
【问题描述】:

我们在 SQL Server 环境中定义了一个链接服务器 (OraOLEDB.Oracle)。 Oracle 12c,SQL Server 2016。SQL Server 上还安装了一个 Oracle 客户端(64 位)。

从 Oracle 检索数据时(一个简单的查询,从 3M 行中获取所有列,相当窄的表,包含 varchars、日期和整数),我们看到以下性能数据:

sqlplus:从 SQL Server 本身上的 Oracle > OS 文件中选择 少于 2k 行/秒

SSMS:使用 OpenQuery 从 Oracle 中插入 SQL Server 表选择(直通到 Oracle,因此远程执行) 少于 2k 行/秒

SQL 导出/导入工具(本质上是 SSIS):插入到 SQL Server 表中,源使用 OLEDB Oracle,目标使用 OLEDB SQL Server 超过 30k 行/秒

寻找使用 OpenQuery/OpenResultSet 提高吞吐量以匹配 SSIS 吞吐量的方法。某处可能有一些缓冲区/标志可以实现相同的目标?

请指教...

谢谢!

--亚历克斯

【问题讨论】:

  • 由于 SSIS 使用 BULK INSERT,所以 SSIS 比 INSERT 查询快是正常的,您必须在 INSERT 期间尽量减少日志记录以提高性能。

标签: sql sql-server oracle ssis linked-server


【解决方案1】:

在某处可能有一些缓冲区/标志可以实现相同的目标?

大概是在找FetchSize参数

FetchSize - 指定提供程序将获取的行数 时间(获取数组)。它必须根据数据大小和 网络的响应时间。如果该值设置得太高,那么这个 在执行查询期间可能会导致更多的等待时间。如果 该值设置得太低,那么这可能会导致更多的回合 访问数据库。有效值为 1 到 429,496 和 296。 默认为 100。

例如

exec sp_addlinkedserver N'MyOracle', 'Oracle', 'ORAOLEDB.Oracle', N'//172.16.8.119/xe', N'FetchSize=2000', ''

见,例如https://blogs.msdn.microsoft.com/dbrowne/2013/10/02/creating-a-linked-server-for-oracle-in-64bit-sql-server/

【讨论】:

  • 这是否需要重新创建链接服务器或者可以在创建后更改?同样,是否可以为 OpenRowSet 指定相同类型的参数,因为它不需要链接服务器?
  • AFAIK 它是丢弃并重新创建的。对于 OpenRowset,它位于 provider_string
  • 我使用附加的 FetchSize 参数设置链接服务器,如下所示:EXEC master.dbo.sp_addlinkedserver @server=N'TEST', @srvProduct='Oracle', @provider='OraOLEDB.Oracle' , @datasrc=N'TEST', @provstr=N'FetchSize=200' ...但性能没有差异(也尝试了其他值,492、496、296)...结果相同
  • 如果从内衬服务器中选择但不写怎么办。例如select max(someColumn) from linkedserver..SCOTT.HR?
【解决方案2】:

我认为有很多方法可以提高 INSERT 查询的性能,我建议阅读以下文章以获取有关数据加载性能的更多信息。

您可以尝试一种方法,即通过使用聚集索引来最小化日志记录。查看以下链接了解更多信息:

【讨论】:

  • 虽然这两个链接都提供了丰富的信息,但它们并没有回答核心问题:同一张表插入在 SSIS 中速度很快,而在通过 OpenQuery 直接加载时速度很慢。因此,日志记录等 - 都是平等的。我怀疑在源而不是目标上缓冲。 SQL Server 肯定能够每秒写入数万行。
  • @AlexV 在使用 SSIS 导入/导出向导时,您没有使用 INSERT INTO 命令,它是批量插入操作。出于这些原因,我提到了第一篇文章。另外第二条可以增强INSERT INTO命令的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2012-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多