Onehdy jsem si hrál s Result Cache...já vím...toto není nová funkce a je již nějakou dobu k dispozici. Bohužel to může chvíli trvat, než se k věcem dostanu.
V mém jednoduchém testu jsem měl dotaz, který vykazoval toto chování:
select
max(det.invoice_date)
from
invoices i
join
invoice_detail det
on i.dept_id=det.dept_id
call count cpu elapsed disk query current rows
------- ------ ------- -------- ---------- ---------- --------- ---------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 2.77 6.66 75521 75583 0 1
------- ------ ------- -------- ---------- ---------- ---------- ---------
total 4 2.77 6.67 75521 75583 0 1
75 000 přečtení disku pro návrat 1 řádku. Au! Nyní to projděte Result Cache a získejte opravdu pěkná čísla. 🙂
select
/*+ result_cache */
max(det.invoice_date)
from
invoices i
join
invoice_detail det
on i.dept_id=det.dept_id
call count cpu elapsed disk query current rows
------- ------ ------ --------- ---------- ---------- ---------- ---------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 0 0 1
------- ------ ------ --------- ---------- ---------- ---------- ---------
total 4 0.00 0.00 0 0 0 1
Stále se vrátil 1 řádek, ale nula čtení disku, nula aktuálních bloků a v podstatě nula uplynulého času. Pěkné!
Mezipaměť výsledků funguje nejlépe při vracení několika řádků v tabulkách, které se často nemění. Operace DML na podkladových tabulkách zneplatní záznam v mezipaměti výsledků a před uložením do mezipaměti výsledků bude nutné provést práci znovu.
Někdy brzy, až budu mít příležitost, zjistím dopad proměnných vazby na dotazy, které používají mezipaměť výsledků.