DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

APPEND_VALUES Хинт в Oracle Database 11g Release 2

В операциях "INSERT ... SELECT" долгое время использовался хинт APPEND:
INSERT /*+ APPEND */ INTO dest_tab SELECT * FROM source_tab;
Подсказка APPEND_VALUES в Oracle 11g Release 2 теперь позволяет нам использовать в своих интересах прямую вставку, когда INSERT использует утверждение VALUES. Подобный эффект использовался ранее при помощи оператора оператор FORALL. Мы будем использовать следующую таблицу, чтобы демонстрировать эффект хинта.
CREATE TABLE forall_test (
id NUMBER(10),
code VARCHAR2(10),
description VARCHAR2(50)
);
ALTER TABLE forall_test ADD (CONSTRAINT forall_test_pk PRIMARY KEY (id));
ALTER TABLE forall_test ADD (CONSTRAINT forall_test_uk UNIQUE (code));
Следующий код заполняет базовую таблицу, затем удаляет половину строк прежде, чем выполнить каждый тест. Это потому что во время обычной вставки Oracle пытается израсходовать любое свободное пространство выделенное в настоящий момент таблице, включая пространство, оставшееся от предыдущего удаления. В прямой вставке Oracle игнорирует существующее свободное пространство и добавляют данные в конец таблицы. После подготовки базовой таблицы мы измеряем время выполнения при помощи оператора FORALL. Затем, мы повторяем тот же самый тест, но на этот раз используем хинт APPEND_VALUES.
SET SERVEROUTPUT ON
DECLARE
TYPE t_forall_test_tab IS TABLE OF forall_test%ROWTYPE;
l_tab t_forall_test_tab := t_forall_test_tab();
l_start NUMBER;
l_size NUMBER := 1000000;
PROCEDURE prepare_table AS
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE forall_test';
INSERT /*+ APPEND */ INTO forall_test
SELECT level, TO_CHAR(level), 'Description: ' || TO_CHAR(level)
FROM dual
CONNECT BY level <= l_size;
COMMIT;
DELETE FROM forall_test WHERE MOD(id, 2) = 0;
COMMIT;
END prepare_table;
BEGIN
-- Populate collection.
FOR i IN 1 .. (l_size/2) LOOP
l_tab.extend;
l_tab(l_tab.last).id := i*2;
l_tab(l_tab.last).code := TO_CHAR(i*2);
l_tab(l_tab.last).description := 'Description: ' || TO_CHAR(i*2);
END LOOP;
prepare_table;
-- ----------------------------------------------------------------
-- Test 1: Time bulk inserts.
l_start := DBMS_UTILITY.get_time;
FORALL i IN l_tab.first .. l_tab.last
INSERT INTO forall_test VALUES l_tab(i);
DBMS_OUTPUT.put_line('Bulk Inserts : ' ||
(DBMS_UTILITY.get_time - l_start));
-- ----------------------------------------------------------------
ROLLBACK;
prepare_table;
-- ----------------------------------------------------------------
-- Test 2: Time bulk inserts using the APPEND_VALUES hint.
l_start := DBMS_UTILITY.get_time;
FORALL i IN l_tab.first .. l_tab.last
INSERT /*+ APPEND_VALUES */ INTO forall_test VALUES l_tab(i);
DBMS_OUTPUT.put_line('Bulk Inserts /*+ APPEND_VALUES */ : ' ||
(DBMS_UTILITY.get_time - l_start));
-- ----------------------------------------------------------------
ROLLBACK;
END;
/
Bulk Inserts : 394
Bulk Inserts /*+ APPEND_VALUES */ : 267
PL/SQL procedure successfully completed.
SQL>
Мы можем видеть, что подсказка APPEND_VALUES дает нам лучшую производительность, разрешая нам использовать прямую вставку в пределах оператора FORALL.







jAntivirus
 


где купить прошитый xbox 360