Oracle
 sql >> база данни >  >> RDS >> Oracle

По-бърз начин за вмъкване чрез скрипт в Oracle?

Проблем

Времето за синтактичен анализ може да се увеличи експоненциално с определени типове изрази, особено INSERT ALL . Например:

--Clear any cached statements, so we can consistently reproduce the problem.
alter system flush shared_pool;
alter session set sql_trace = true;

--100 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 100 times
    ...
select * from dual;

--500 rows
INSERT ALL
    INTO FileIds(Id,FileTypeGroupId) VALUES(1, 1)
    ...
    repeat 500 times
    ...
select * from dual;

alter session set sql_trace = false;

Пуснете файла за проследяване през tkprof и можете да видите, че времето за анализ се увеличава драстично за голям брой редове. Например:

100 реда:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.06       0.05          0          1          0           0
Execute      1      0.00       0.00          0        100        303         100
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.06       0.05          0        101        303         100

500 реда:

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1     14.72      14.55          0          0          0           0
Execute      1      0.01       0.02          0        502       1518         500
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     14.74      14.58          0        502       1518         500

Решения

  1. Разделете голямото си изявление на няколко по-малки изявления. Трудно е да се намери оптималният размер. В някои версии на Oracle има магически брой редове, които ще причинят проблема. Обикновено използвам около 100 реда - достатъчно, за да получа повечето от предимствата на групиращите изрази, но достатъчно ниско, за да избегна грешката при анализа. ИЛИ...
  2. Опитайте insert into ... select ... from dual union all ... вместо това метод. Обикновено работи много по-бързо, въпреки че производителността на анализа може също да се влоши значително с размера.
  3. Надстройте Oracle. Производителността на синтактичния анализ се подобри в по-новите версии. Вече не мога да възпроизвеждам този проблем във версия 12.2.

Предупреждение

Не извличайте грешен урок от това. Ако се притеснявате за производителността на SQL, в 99% от времето е по-добре да групирате подобни неща заедно, вместо да ги разделяте. Правите нещата по правилния начин, просто се натъкнахте на странен бъг. (Потърсих моята поддръжка на Oracle, но не можах да намеря официална грешка за това.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се свържете с Oracle, като използвате име на услуга вместо SID

  2. Възстановяване на файлове на SQL Editor (заявки, процедури) след срив или увисване на Toad For Oracle

  3. Датата на Oracle TO_CHAR('ДД, ГГГГ') има допълнителни интервали в нея

  4. 4 PL/SQL примера за анонимни блокове

  5. Как да изброя всички таблици в схема в Oracle SQL?