sql >> Database teknologi >  >> RDS >> Oracle

Hurtigere måde at indsætte, via script, i Oracle?

Problem

Parsingtiden kan øges eksponentielt med visse typer udsagn, især INSERT ALL . For eksempel:

--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;

Kør sporingsfilen gennem tkprof, og du kan se Parse-tiden øges dramatisk for et stort antal rækker. For eksempel:

100 rækker:

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 rækker:

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

Løsninger

  1. Opdel dit store udsagn i flere mindre udsagn. Det er svært at finde den optimale størrelse. På nogle versioner af Oracle er der et magisk antal rækker, der vil forårsage problemet. Jeg går normalt efter omkring 100 rækker - nok til at få de fleste fordele ved at gruppere udsagn, men lavt nok til at undgå parsing-fejlen. ELLER...
  2. Prøv insert into ... select ... from dual union all ... metode i stedet for. Det kører normalt meget hurtigere, selvom dets parsingydelse også kan forringes betydeligt med størrelsen.
  3. Opgrader Oracle. Parsing ydeevne er forbedret i nyere versioner. Jeg kan ikke længere genskabe dette problem i version 12.2.

Advarsel

Lær ikke den forkerte lektie af dette. Hvis du er bekymret for SQL-ydeevne, er du 99 % af tiden bedre stillet til at gruppere lignende ting sammen i stedet for at dele dem ad. Du gør tingene på den rigtige måde, du er lige stødt ind i en mærkelig fejl. (Jeg søgte i My Oracle Support, men kunne ikke finde en officiel fejl til dette.)




  1. Sådan arbejder du med MySQL-underforespørgsler

  2. SQL Server Full Text Search Escape Characters?

  3. Brug af SQL Server som en DB-kø med flere klienter

  4. Returner rækker, der matcher elementer af input-array i plpgsql-funktionen