将数据从 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 的相关文章

  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun
  • VB6+SQL-Server:如何使用 ADODB.Command 执行带有命名参数的查询?

    我一直在尝试使用 ADODB Command 执行参数化查询 我知道我可以使用 对于参数 但我的查询相当大 我真的不想跟踪参数的确切顺序 我尝试了类似以下的操作 objCmd CommandType adCmdText objCmd Com
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

    我已经在 SQL Server 中设置了一个运行良好的存储过程 我现在可以从 VBA 调用它 但想返回一个值以了解是否存在任何错误等 我的 SP 中的最后一个参数设置为 OUTPUT DataSetID int 0 Destination
  • SQL Server:从 OPENDATASOURCE 中删除

    这有效 SELECT FROM OPENDATASOURCE Microsoft ACE OLEDB 12 0 Data Source d JobFiles MyFile xlsx Extended properties Excel 8 0
  • 删除 IF ELSE 语句中的临时表

    我在这里面临僵局 问题是我必须更改使用 3 个不同临时表的过程 为了便于对话 让我们将它们命名为 temptable1 temptable2 temptable3 我无法在这里复制 粘贴整个过程 但总体思路是这样的 原始过程 procedu
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • 如何在SSIS中将数据库名称设置为变量?

    在我当前的项目中 数据库名称不断变化 我不想每次都修改我的 OLE DB 源 因此我想将其设置为变量 也就是说 在每个 OLE DB Source 中 我可以将它用作参数 但是 SSIS 似乎不允许将数据库名称作为参数传输 那么我应该怎样做
  • 如何将 数组传递给存储过程

    我有一个清单索赔数据在 C 中 它有三个项目 日期 类型和描述 其中可以有多行 如下所示 索赔数据 Date Type Description 01 02 2012 Medical Its a medical 05 02 2013 Thef
  • SSIS 包卡在“已创建执行”状态

    我最近对我的一个 SSIS 项目部署了更新 自从该项目失败后 它就按计划运行了 SSIS 包似乎停留在 已创建执行 状态 报告中没有任何消息来解释这个问题 我尝试重新部署该项目 但结果保持不变 我最终不得不恢复到早期版本的部署以使系统重新上
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 是否有适用于 SQL Server Express 的 SQL Server Profiler? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 SQL Server Express 的 SQL Server Profiler 也许是开源的 或者也许只是一个可以帮助我查
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • 我可以从 SQL Server 读取元数据来了解最后更改的行/表吗?

    我们有一个数据库hundreds的桌子 有没有某种metaSQL Server 中的数据源 我可以以编程方式查询以获取名称最后更改表和行 或者我们是否需要实施这个我们自己每个表中的字段称为上次更改日期时间 etc 就查明表最后一次修改的时间
  • SQL Server 架构和默认架构

    我的数据库中有一个模式定义 除了现在每次执行 sql 语句时我都必须提供模式 SELECT FROM myschema table 我使用 Management Studio 为我的用户设置了默认架构 并运行了ALTER USER myUs
  • 尝试从 Linux 通过 ODBC 连接到 SQL Server 2014 时出现错误代码 0x2746 (10054)

    Ubuntu 22 04 1 LTS pyodbc 4 0 35 OpenSSL 3 0 2 15 Mar 2022 Library OpenSSL 3 0 2 15 Mar 2022 遵循的步骤安装适用于 SQL Server Linux
  • 如何在 SQL 选择查询中将行转换为 JSON?

    以下查询将整个表返回为单个 JSON 字符串 JSON 对象列表 每行一个 SELECT FROM MyTable FOR JSON AUTO 我需要返回多行 其中每行都是表中单行的 JSON 字符串 例如 如果表字段为 A B C 输出应
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经

随机推荐

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

    这个问题在这里已经有答案了 可能的重复 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