问题:我的团队目前正在进行从 ECC 系统到新 S/4 Hana 系统的 ERP 迁移。作为上线的一部分,我们的团队需要将所有表从 S/4 系统复制到我们将托管数据的 SLT 模式中。大多数表将由 SAP 之外的 SLT 复制处理。但是,由于时间紧迫,我们确定了 4 个需要多天复制的表。想法是从远程源 (ABAP/SDA) 复制现有数据并放置在我们的 SLT 模式中。一旦完成,我们可以激活点前向复制并允许更新所有新的或修改的记录查看 SLT 复制。
尝试的方法:我们当前的方法是与后端 S/4 数据库建立 SDA 连接,并按年份分解数据,以使用存储过程插入到我们的本地表中。这种方法出现了许多问题,但它目前正在发挥作用。它只是超级慢。
论坛问题:
- 这是您处理此类问题的方式吗?如果没有,您提出的解决方案是什么?
- 您是否在目标表中看到任何需要自定义以提高性能的内容?
- 存储过程中是否有任何突出的地方需要调整?
示例: 假设我们有一个名为:A_tbl的源表
- A_tbl 中有 5 亿条记录
- 大约 500 列宽
然后我们将有我们的目标表:B_tbl
- 与 A_tbl (500) 相同的列数
- 12 人轮循分区
- 索引 5 列
当前程序:
CREATE OR REPLACE procedure LOAD_B_TBL_FROM_A_TBL ()
as
begin
declare v_offset_nbr integer;
declare v_record_count integer;
declare v_commit_count integer;
declare i integer;
declare v_year nvarchar(4);
declare v_record_per_commit_count CONSTANT INT = 1000000;
declare v_table_name CONSTANT NVARCHAR(30) = 'A_TBL';
declare v_start_year CONSTANT INT = 2011;
declare v_end_year CONSTANT INT = 2022;
declare year_nbr integer;
for year_nbr in v_start_year..v_end_year do
select IfNull(max(offset_nbr),0) into v_offset_nbr from B_TBL_SCHEMA.bulk_load_log where table_name = :v_table_name AND year_nbr = to_varchar(year_nbr); -- Get offset number of records
select count(*) into v_record_count from A_TBL_SCHEMAA_TBL A_TBL WHERE A_TBL.YEAR = to_varchar(year_nbr); -- Count the source records.
v_record_count = v_record_count - v_offset_nbr; -- Subtract out the records already committed for the current year. Failsafe if procedure fails
v_commit_count = v_record_count / v_record_per_commit_count; -- Number of times we need to loop
IF v_record_count < v_record_per_commit_count THEN -- Don't enter the loop if it's not necessary
INSERT INTO B_TBL_SCHEMA.B_TBL (
SELECT * FROM A_TBL_SCHEMAA_TBL
WHERE A_TBL.YEAR = to_varchar(year_nbr)
); -- Insert into our target table
COMMIT;
insert into B_TBL_SCHEMA.bulk_load_log values(
v_table_name,
to_varchar(year_nbr),
:v_offset_nbr,
now()
); -- Insert into a logging table to keep up with offset
ELSE
for i in 0..v_commit_count do -- Loop number of commit times. (500 million / 1 million) = 500 commits necessary to process entire table
INSERT INTO B_TBL_SCHEMA.B_TBL (
SELECT * FROM A_TBL_SCHEMAA_TBL
WHERE A_TBL.YEAR = to_varchar(year_nbr)
LIMIT :v_record_per_commit_count OFFSET :v_offset_nbr
); -- Insert into our target table
COMMIT;
v_offset_nbr = v_offset_nbr + v_record_per_commit_count; -- Update the offset before logging so we know where to begin if procedure fails
insert into B_TBL_SCHEMA.bulk_load_log values(
v_table_name,
to_varchar(year_nbr),
:v_offset_nbr,
now()
); -- Insert into logging table to keep up with offset
COMMIT;
end for;
end if;
end for;
end;