SAP HANA |БОЛЬШАЯ ВСТАВКА в SAP HANA - PullRequest
0 голосов
/ 20 января 2019

У нас есть SAP HANA 1.0 SP11.У нас есть одно требование, в котором нам нужно ежедневно рассчитывать текущий запас в магазине, уровень материала.Число ожидаемых строк составляет около 250 млн.

В настоящее время мы используем процедуру для того же.Ход процедуры следующий:

begin

t_rst = select * from <LOGIC of deriving current stock on tables MARD,MARC,MBEW>;

select count(*) into v_cnt from :t_rst;

v_loop = v_cnt/2500000;


FOR X in 0 .. v_loop  DO

INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;
COMMIT;
count := count + 2500000;    
END FOR;

end;

Количество строк набора результатов t_rst составляет около 250 млн. Общее время выполнения процедуры составляет около 2,5 часов .Несколько раз процедура переходит в длительное состояние, приводящее к ошибке .Мы выполняем эту процедуру в непиковые часы работы, поэтому нагрузка на систему практически равна нулю.

Есть ли способ, которым мы можем загружать данные в таблицу назначения в параллельных потоках и сокращать время загрузки.Также есть эффективный способ массовой вставки в HANA.

Запрос для t_rst извлекает первые 1000 строк за 5 минут.

1 Ответ

0 голосов
/ 22 января 2019

Как отметил Ларс, общее использование ресурсов не изменится эффективно

Но если у вас ограниченное время (непиковые часы) и если конфигурация системы будет соответствовать требованиям параллельного выполнения, возможно, вы можете попробовать использовать

BEGIN PARALLEL EXECUTION 
   <stmt> 
END;

Пожалуйста, обратитесь к справочной документации

После того, как вы вычислили значение v_loop, вы знаете, сколько раз вам нужно было выполнить команду INSERT

INSERT INTO CRRENT_STOCK_TABLE
SELECT * FROM :t_rst LIMIT 2500000 OFFSET :count;

Я не уверен, как преобразовать приведенный выше код в динамический расчет для PARALLEL EXECUTION

Но вы можете предположить, скажем, 10 параллельных процессов и выполнить столько команд INSERT, изменив предложение OFFSET в соответствии с вычисленными значениями

Те, которые вы превысите, будут работать с нулевыми строками, которые не повредят всему процессу

В ответ на @LarsBr. Как он упомянул, существуют ограничения, которые будут препятствовать параллельному выполнению

Ограничения и ограничения

Применяются следующие ограничения:

Modification of tables with a foreign key or triggers are not allowed

Updating the same table in different statements is not allowed

Only concurrent reads on one table are allowed. Implicit SELECT and SELCT INTO scalar variable statements are supported.

Calling procedures containing dynamic SQL (for example, EXEC, EXECUTE IMMEDIATE) is not supported in parallel blocks

Mixing read-only procedure calls and read-write procedure calls in a parallel block is not allowed.

Эти ограничения говорят о том, что вставка в одну и ту же таблицу невозможна при разных исполнениях, и динамический SQL тоже нельзя использовать

...