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
- 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...
- 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. - 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.)