将数据从 SAP 提取到 SQL Server

Posted

技术标签:

【中文标题】将数据从 SAP 提取到 SQL Server【英文标题】:Extracting Data from SAP to SQL Server 【发布时间】:2019-10-02 18:52:47 【问题描述】:

我正在使用 SSIS 包将数据从 SAP 数据库表中提取到 SQL Server 表中。我正在使用 OLEDB 源/目标连接来实现这一点。

现在的问题是 SAP 中的一个表有 500 万条记录,并且需要大约 2 个小时才能将这些数据提取到我的 SQL Server 表中。我使用了 trunc-dump 方法(截断 sql server 中的表并将数据从 SAP 表中转储到其中),并且还尝试使用 Multiple Hash 键来引入更新/新记录。

哈希键的问题在于它仍然需要扫描整个表来查找更改/新记录,因此与 trunc-dump 方法所花费的时间几乎相同。

我正在寻找一种新方法或更改现有方法以减少完成此提取所需的时间。

【问题讨论】:

您可以访问 SAP 表吗?是否可以在其上添加 WhenUpdated 日期时间字段,然后使用该字段过滤/刷新数据? 如果可以的话,在WhenUpdated 字段上也有一个索引。 @VitalyBorisov SAP 是专有软件,如果我们对 SAP 标准表进行更改,我们将失去 SAP 支持,我认为我的公司还没有准备好进行更改。 SAP 是否允许在其中构建任何逻辑?像在动力学?触发器? @VitalyBorisov 这可以追溯到我对您的第一个建议的回答。我希望我可以对表格进行任何此类更改,但我不能。我不相信变更数据捕获是可能的。您还有其他想法吗? 【参考方案1】:

正如您提到的,您使用 OLEDB 源连接来访问 SAP,如果这意味着您正在直接访问 SAP 的底层数据库,您应该出于三个原因暂停这样做,直到获得明确的 IT 批准:

    您跳过了 SAP 的应用层安全。可能存在企业安全合规问题; 贵公司的 SAP 许可证可能不允许您这样做。如果您的公司只有 SAP 间接访问许可证,那么您可能必须留在应用层; 直接访问底层数据库不会获得 SAP 的官方支持。

您有多种选择通过 SAP 应用层使用 SSIS 获取数据:

    为这项工作使用商业 SSIS 自定义组件(免责声明:AecorSoft 是提供此类连接组件的领先供应商之一); 查看 SAP 自己的 OData 网关接口以使用数据。 请求您的 SAP ABAP 团队编写自定义 ABAP 程序,将 SAP 数据转储到 CSV 文件中,然后使用 SSIS 获取它们。

现在让我们看看性能方面:

SAP ETL 性能取决于许多因素,但总的来说,即使对于具有 100 多列的 SAP 事务表,每几个小时提取 500 万行也被认为非常慢。例如,我们已经看到以每 1-2 分钟 1M 行的一致性能提取标准 SAP General Ledger 标题表 BKPF(几乎 100 列)的案例。当然,这样的性能是通过商业组件和 SSIS 实现的,但是即使对于上面的#3 选项,您也应该期望每 10 分钟至少 1M,通过中间 CSV 文件。在后台,通过 SAP 应用层,所有 3 个选项都将利用 SAP Open SQL(与底层数据库提供的“Native SQL”相反)来访问 SAP 表,因此,如果您遇到应用层性能问题,您可以分析 Open SQL 端。

您还提到了更新/新记录方案,这是一个典型的增量提取问题。通常,在 SAP 事务表中,有创建日期和更改日期字段可以帮助您捕获增量。在这种情况下,为了避免全表扫描,通过 SAP 应用层在那些“增量字段”上应用索引。例如,如果您需要提取 Sales Document Header VBAK 表,您可以按 ERDAT (Created on) 和 AEDAT (Changed on) 进行筛选。 Delta 在 SAP 中是一个复杂的主题。没有简单的语句来描述增量解决方案,因为 SAP 数据模型很复杂,并且在不同的功能模块之间存在很大差异。增量分析始终是一个个案。有些人也可能简单地推荐使用“delta extractors”,但不要将其视为银弹,因为extractor有其自身的问题。简而言之,如果您研究基于表的提取,请专注于此,并尝试与您的 SAP 职能团队一起确定合适的增量字段。尽量避免进行全表扫描和散列。使用先前提取的一些可选重叠执行增量加载(例如加载今天和昨天的记录),并执行 MERGE 以吸收更改。

在少数情况下您可能无法找到任何 delta 字段,并且始终进行满载是不切实际的。一个很好的例子是地址主数据表 ADRC。在这种情况下,如果您需要在此类表上进行增量加载,您必须要求您的 SAP 功能团队为您计算增量(这意味着他们将自定义逻辑注入到可以创建、更新或已删除),或者您必须要求您的 SAP Basis 团队在底层数据库表上创建 DB 触发器,并在应用层公开触发器表。这样,您可以在主表和触发器表上创建应用层视图来做增量。尽管如此,您的解决方案仍无法直接访问数据库。数据库层触发器完全由您的 SAP Basis 团队管理和控制,他们也支持数据库。

希望这会有所帮助!

【讨论】:

以上是关于将数据从 SAP 提取到 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

sql server如何如何从一个表中提取部分资讯插入到另一表中

使用 Excel 宏从 SAP 中提取数据

将xml中的数据提取到SQL Server表中

c# 为啥从sql server中提取float型,提取9.99结果却是9.9900000000000002

在 PowerShell 中将大型 blob 从 SQL Server 提取到文件需要很长时间

将数据从 BigQuery 导入 SQL Server [关闭]