Oracle использует временную таблицу или другой метод - PullRequest
0 голосов
/ 14 мая 2019

В Oracle необходимо повторно использовать результаты запроса несколько раз в сохраненном процессе. Хотите знать, если временная таблица является рекомендуемым способом или что-то еще ...

Сначала я создаю набор результатов на основе определенных входных параметров.

Затем выполните несколько проверок, чтобы увидеть, появляются ли какие-либо строки результирующего набора в таблице 1. Достаточно простого объединения и подсчета. Если count> 0, вернитесь. Если count == 0, тогда я вставляю выбранные значения из набора результатов (на основе некоторых условий) в таблицу 1.

Стоит ли использовать временную таблицу или что-то еще для оптимальной производительности?

Спасибо

1 Ответ

1 голос
/ 14 мая 2019

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

Всегда лучше тестировать и тестировать (сравнивать достоинства и недостатки, а также производительность временной таблицы с другими подходами). Я включу здесь альтернативный стиль, который просто вытягивает результаты в память, где их можно запрашивать по мере необходимости (или повторять, подсчитывать и т. Д.)

Пример ниже:

- Пример данных:

CREATE TABLE TABLE_1 (LOREM_IPSUM NUMBER);
INSERT INTO TABLE_1 VALUES (6);
COMMIT;

- Пользовательские типы для хранения данных

CREATE OR REPLACE TYPE EXPENSIVE_QUERY_TYPE IS OBJECT(LOREM_IPSUM NUMBER);
/
CREATE OR REPLACE TYPE EXPENSIVE_QUERY_RESULT IS TABLE OF EXPENSIVE_QUERY_TYPE;
/

- Пример блока:

DECLARE
    V_EXPENSIVE_RESULT EXPENSIVE_QUERY_RESULT := EXPENSIVE_QUERY_RESULT();
    V_TABLE_1_TEST INTEGER;
BEGIN
    SELECT EXPENSIVE_QUERY_TYPE(LEVEL)
    BULK COLLECT INTO V_EXPENSIVE_RESULT
    FROM DUAL
    CONNECT BY LEVEL <= 5;

    SELECT COUNT(*) INTO V_TABLE_1_TEST
        FROM TABLE_1
            WHERE EXISTS(SELECT 1 FROM TABLE(V_EXPENSIVE_RESULT) WHERE LOREM_IPSUM = TABLE_1.LOREM_IPSUM);

    IF V_TABLE_1_TEST > 0
        THEN
        RETURN;
        ELSE
        INSERT INTO TABLE_1
            SELECT LOREM_IPSUM FROM TABLE(V_EXPENSIVE_RESULT)
            WHERE MOD(LOREM_IPSUM,2) = 0;
    END IF;

END;
/

Когда TABLE_1 изначально имеет только одну запись со значением 6, вставляются 2 и 4 (поскольку нет общих данных).

...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
   LOREM_IPSUM
______________
             2
             4
             6

Но если он содержит что-либо в дорогостоящем запросе (например, изначально включающему в себя и 3, и 6), ничего не вставляется:

...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
   LOREM_IPSUM
______________
             3
             6
...