Есть ли разница в производительности между EXECUTE ('CALL SCHEMA.PROC'), CALL SCHEMA.PROC и EXCEUTE? - PullRequest
0 голосов
/ 24 октября 2019

Отличается ли производительность между тремя вариантами, если принять следующую структуру запроса:

CREATE PROCEDURE SCHEMA.PROC
BEGIN
TEMP = SELECT * FROM A JOIN B JOIN C;
INSERT INTO TABLE (TEMP);
END;

Опция 1:

STRING_OF_PROC = 'CALL SCHEMA.PROC()';

EXECUTE IMMEDIATE (STRING_OF_PROC);

Опция 2:

CALL SCHEMA.PROC();

Вариант 3:

EXECUTE IMMEDIATE ( TEMP = SELECT * FROM A JOIN B JOIN C; 
                    INSERT INTO TABLE (TEMP); );

Если он отличается в разных СУБД, я работаю в пространстве SAP HANA.

1 Ответ

0 голосов
/ 25 октября 2019

Хорошо, вопрос довольно расплывчатый, поэтому мой ответ просто опишет различные варианты и что из этого следует.

Опция 0: это хранимая процедура, которая выполняет SELECT и пытается вставить результатв таблицу.

Вариант 1: Подготавливается строка, содержащая текст для CALL procedure(), которая затем используется для динамического выполнения SQL EXECUTE IMMEDIATE.

Вариант 2: aпрямой вызов процедуры.

Вариант 3: EXECUTE IMMEDIATE вызов с блоком команд SQLScript.

Вариант 3 объявления просто не будет работать вообще и приведет к ошибке, поскольку EXECUTE IMMEDIATE ожидает команду string . Эта командная строка должна быть корректной SQL, что здесь не так. Кроме того, это может быть только одна команда, а не список из нескольких команд.

Как варианты 1 и 2: они практически идентичны с точки зрения производительности. Очевидно, что параметр динамического SQL требует дополнительного разбора и, вероятно, приведет к дополнительным записям в общем кэше SQL, но это должно быть незначительной частью общего времени выполнения вызова процедуры.

Кстати: процедура в варианте 0также не работает - процедура синтаксически неверна в нескольких местах.

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

...