将数据从 SAP 提取到 SQL Server

2023-12-03

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

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

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

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


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

  1. 您跳过了 SAP 的应用程序层安全性。可能存在企业安全合规问题;
  2. 您公司的 SAP 许可证可能不允许您这样做。如果你的公司只有SAP间接访问许可,那么你可能只能停留在应用层;
  3. 直接访问底层数据库并不能获得SAP的官方支持。

您有多种选项可以通过 SAP 应用程序层使用 SSIS 获取数据:

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

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

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

正如您还提到的更新/新记录场景,这是一个典型的增量提取问题。通常,在 SAP 事务表中,有“创建日期”和“更改日期”字段可以帮助您捕获增量。在这种情况下,为了避免全表扫描,请通过 SAP 应用程序层在这些“增量字段”上应用索引。例如,如果您需要提取销售凭证标题VBAK表,您可以按ERDAT(创建日期)和AEDAT(更改日期)进行过滤。 Delta 是 SAP 中的一个复杂主题。没有简单的语句来描述增量解决方案,因为 SAP 数据模型非常复杂,并且各个功能模块之间差异很大。增量分析始终是具体情况具体分析的工作。有些人可能还简单地推荐使用“delta extractors”,但不要将其视为灵丹妙药,因为提取器有其自身的问题。简而言之,如果您研究基于表的提取,请重点关注这一点,并尝试与您的 SAP 功能团队合作来确定合适的增量字段。尝试避免进行全表扫描和散列。对先前提取的一些可选重叠进行增量加载(例如加载今天和昨天的记录),并进行合并以吸收更改。

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

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据从 SAP 提取到 SQL Server 的相关文章

随机推荐

  • [电子邮件受保护] 还不够;无法点击屏幕底部[重复]

    这个问题在这里已经有答案了 可能的重复 iPhone 5 模拟器 无法点击屏幕底部 我添加了一个 电子邮件受保护 到我的项目 导致信箱区域消失 然而 对于这个项目 我发现这不够 我无法点击屏幕底部的任何像素 并且全屏动画会遮蔽该区域 信箱区
  • Django 模板不存在 admin/login.html

    我正在使用 django 1 4 并且出现了这个错误 模板不存在于 admin 管理 登录 html 我尝试重新安装 django 但没有成功 请帮助 您可以尝试将管理模板路径名添加到 django settings py 中的 TEMPL
  • gnuplot rowstacked 直方图:如何将总和放在条形上方

    这个问题与gnuplot 直方图 如何将值放在条形顶部 我有一个数据文件file dat x y1 y2 1 2 3 2 3 4 3 4 5 和 gnuplot set style data histogram set style hist
  • 如何在 VB.NET 中创建通用属性?

    我想做这样的事情 Private myCollection As IList Of T Public Property MyProperty Of T as IList Of T Get Return Me myCollection End
  • CryptGenRandom() 是线程安全的吗?

    CryptGenRandom 对于单个全局程序范围的 HCRYPTPROV 实例来说是线程安全的吗 MSDN 似乎缺乏这方面的任何信息 https msdn microsoft com en us library windows deskt
  • 复合 mdfind 搜索

    目标是查找某个州或国家 地区的所有图像 mdfind kind image 会找到所有图像 mdfind kMDItemCountry United States 将找到具有此属性的所有文件 mdfind kind image kMDIte
  • Doctrine 在水合过程中添加了额外的查询,导致“正常”一对一和自引用关系出现 n+1 问题

    News使用一对多自引用方法相互关联 一个消息是父级 可以有多个子级 更何况各有各News与 具有正常 非自引用 一对一关系Event and Gallery 当我运行简单的 DQL 时 SELECT n FROM App Entity N
  • 除非手动执行,否则 Elastic Beanstalk 上的“npm install”会失败

    我有一个带有 PHP 应用程序的 Elastic Beanstalk 环境 我只想跑npm install我的应用程序部署后 node and npm都通过部署配置安装在服务器上 我定义了一个容器命令 只需 cd 到正确的目录 然后运行np
  • 如何使用log4cxx保留单个文件并覆盖同一文件中的内容?

    在我的应用程序中 多个线程将数据记录在同一个文件中 如果文件大小超过限制 那么我必须删除文件中的特定记录并将所有内容向上移动 我可以在 Log4cxx 中执行此操作吗 如果可以 请回复您的想法 谢谢 该示例将解决您的问题 log4j roo
  • Erlang 有支持 AJAX 的模块吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想创建一个能够接收和发送 AJAX 消息的 Erlang 服务器 有没有提供此功能的模
  • Botmaker 解决 Qnamaker 后续问题

    对于我当前的项目 我尝试使用仅上下文的后续提示 My problem is now that some of the questions from the follow up prompts are the same 在 qna ui 中
  • 如何在处理函数的其余部分之前更新 WPF 中的 UI 元素?

    我想在用户单击按钮后立即禁用该按钮以阻止他们再次单击它 单击它时会执行许多检查 并且这些检查似乎是在 UI 更改发生之前完成的 我试图通过为按钮使用单独的线程来做到这一点 但它似乎仍然只在检查完成后更新 这是我正在使用的代码 private
  • 将子文档数组元素添加到mongoDB中的子文档数组元素

    这可能吗 我有一个集合 C 其中包含属性 A1 的数组 每个属性都有一个子属性数组 A2 如何将子文档添加到特定的 C A1 子文档 这是一个例子 db docs insert id 1 A1 A2 1 2 3 A2 4 5 6 如果您知道
  • 实体框架。删除表中的所有行

    如何使用实体框架快速删除表中的所有行 我目前正在使用 var rows from o in dataDb Table select o foreach var row in rows dataDb Table Remove row data
  • 使用 Java 8 将 ms 转换为字符串日期

    我有一个毫秒时间戳 并使用 SimpleDateFormater 对其进行格式化 如下所示 SimpleDateFormat sdfDate new SimpleDateFormat MM d yyyy h mm a return sdfD
  • 如何使用 .NET 从十六进制颜色代码获取颜色?

    如何从十六进制颜色代码中获取颜色 例如 FFDFD991 我正在读取文件并获得十六进制颜色代码 我需要创建相应的System Windows Media Color十六进制颜色代码的实例 框架中有内置方法可以做到这一点吗 我假设这是一个 A
  • MPI 和 C 结构

    我必须承认 当我看到使用 MPI 传输一个 C 结构体需要多少行代码时 我感到非常震惊 在什么情况下可以使用预定义的数据类型简单地传输结构MPI CHAR 考虑以下示例 struct particle double x double y l
  • PHP switch 语句变量范围

    在 PHP 中 switch 语句中的变量作用域是如何处理的 例如 以这个假设的例子为例 someVariable 0 switch something case 1 someVariable 1 break case 2 someVari
  • 如何在maven多模块项目中仅运行父pom.xml

    我有 Maven 多模块项目 在父级 我有一些java文件 在父 pom xml 中 在打包阶段我做了一些事情 通常 当我在父级别运行 mvn package 时 父 pom 的 package 阶段将运行 并且所有模块也将被打包 我正在寻
  • 将数据从 SAP 提取到 SQL Server

    我正在使用 SSIS 包将 SAP 数据库表中的数据提取到 SQL Server 表中 我正在使用 OLEDB 源 目标连接来实现此目的 现在的问题是 SAP 中的一个表有 500 万条记录 需要大约 2 小时才能将这些数据提取到我的 SQ