One interesting question, however, is what happens when PQ slave needs to read some blocks from disk given that object has been qualified for in-memory (cached) access? Would the slave do it using direct or buffered I/O?
The answer becomes somewhat clear once you realize that in-memory PQ is enabled by simply utilizing buffered reads. Since direct path reads can not take advantage of any blocks stored in the buffer cache (local or remote), trying to do direct path reads will defeat the whole point of in-memory PQ.
To demonstrate the point here is the excerpt from a tkprof output for one of the parallel query slaves:
Rows (1st) Rows (avg) Rows (max) Row Source Operation ---------- ---------- ---------- --------------------------------------------------- 0 0 0 SORT AGGREGATE (cr=0 pr=0 pw=0 time=0 us) 0 0 0 PX COORDINATOR (cr=0 pr=0 pw=0 time=0 us) 0 0 0 PX SEND QC (RANDOM) :TQ10000 (cr=0 pr=0 pw=0 time=0 us) 1 1 1 SORT AGGREGATE (cr=62838 pr=62500 pw=0 time=7492751 us) 57696 62500 72120 PX BLOCK ITERATOR (cr=62838 pr=62500 pw=0 time=24528381 us cost=18846 size=0 card=500000) 57696 62500 72120 TABLE ACCESS FULL Z_TEST (cr=62838 pr=62500 pw=0 time=23944184 us cost=18846 size=0 card=500000) Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ PX Deq: Execution Msg 128 0.19 1.06 db file scattered read 4546 0.16 43.99 latch free 1 0.00 0.00 latch: cache buffers lru chain 31 0.01 0.03 latch: cache buffers chains 3 0.00 0.00 latch: object queue header operation 4 0.00 0.00Note that the slave waited on db file scattered read event which is nothing else but buffered multiblock reads. If you were to run the same test on the Exadata platform you would see cell multiblock physical read event instead, given that in-memory PQ did get utilized. There are a couple of consequences for this:
- There is no need to do object level checkpoint. This makes in-memory PQ somewhat more friendly to be running in OLTP environment since it doesn't need to flush any dirty buffers to disk.
- If you running on the Exadata platform, none of the offloading will happen, even if you have to read the significant portion of the table from disk.
On another note it looks like the things came full circle. Serial sessions are now able to utilize direct path reads while parallel query slaves are able to do buffered I/O.
All tests were done on 11.2.0.3 (both Exadata and non-Exadata).
No comments:
Post a Comment