It depends, but we can analyse two extremes. Only user mode cpu usage is put here, sys mode cpu is in the output of prstat shown later.
1: If oracle needs to scan lots of blocks for each fetch.
Such as select count(*) using FTS or the where clause filter out 99% of the data read by oracle, then the bottle neck is at the database side.
A: If most of the blocks are in SGA and little PIO is required.
Then one session could use nearly 100% cpu.
B: If most of the blocks are not in SGA and lots of PIO is required.
Then the session spends most of it’s time on IO. Depending on the storage performance and how much data oracle read in (controlled by DB_FILE_MULTIBLOCK_READ_COUNT), the cpu used varies. In my test with HDS USPV storage, the average cpu usage is about 30% if DB_FILE_MULTIBLOCK_READ_COUNT is 16 and cpu is about 35% if DB_FILE_MULTIBLOCK_READ_COUNT is 128.
2: If oracle returns all the data in a block to client side.
Such as select * from tab_name (of cause the blocks should not be empty, such as after delete a huge table), then the bottleneck is sql*net. Oracle will spend a little time on cpu to read the data, and then spend more time to wait on sql*net, and then spend time on cpu, and then wait on sql*net, etc. The average cpu usage is low. In my test, the cpu used is only about 5~6%. [updated: if sql*net is the bottleneck, storage capacity is not likely a problem ]
Test 1.A
SQL> select count(*) from test_net1;
COUNT(*)
----------
100000
SQL>
SQL> select a.SPID
2 from v$process a
3 where a.ADDR =
4 (select b.PADDR
5 from v$session b
6 where b.SID = (select sid from v$mystat where rownum = 1));
SPID
------------
27956
SQL>
SQL> declare
2 a int;
3 begin
4 for i in 1..10000
5 loop
6 select count(*) into a from test_net1;
7 end loop;
8 end;
9 /
^Cdeclare
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
ORA-06512: at line 6
TEST-qihua$> prstat -mLc -p 27956 1 100|grep 27956
27956 oracle 98 0.1 0.0 0.0 0.0 0.0 1.6 0.0 3 5 107 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1 7 92 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 6 102 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 4 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1 5 92 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 6 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 4 94 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 4 94 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 4 96 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3 6 94 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 5 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1 5 92 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 6 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 6 100 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 6 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2 5 93 0 oracle/1
27956 oracle 100 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 6 91 0 oracle/1
27956 oracle 80 0.0 0.0 0.0 0.0 0.0 20 0.0 4 6 91 1 oracle/1 ==> cancelled.
27956 oracle 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 oracle/1
Test 1.B & DB_FILE_MULTIBLOCK_READ_COUNT=16
SQL> alter session set DB_FILE_MULTIBLOCK_READ_COUNT=16;
Session altered.
SQL> select count(*) from huge_table;
^Cselect count(*) from huge_table
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
TEST-qihua$> !!
prstat -mLc -p 27956 1 100 | grep 27956
27956 oracle 6.0 0.2 0.0 0.0 0.0 0.0 94 0.0 11 0 16 0 oracle/1
27956 oracle 21 5.0 0.1 0.0 0.0 0.0 74 0.3 382 4 382 0 oracle/1
27956 oracle 25 5.9 0.1 0.0 0.0 0.0 69 0.4 450 3 450 0 oracle/1
27956 oracle 20 4.9 0.1 0.0 0.0 0.0 74 0.3 367 3 369 0 oracle/1
27956 oracle 24 5.8 0.1 0.0 0.0 0.0 70 0.4 435 5 435 0 oracle/1
27956 oracle 20 4.7 0.1 0.0 0.0 0.0 75 0.3 361 2 361 0 oracle/1
27956 oracle 22 5.1 0.1 0.0 0.0 0.0 73 0.3 387 2 387 0 oracle/1
27956 oracle 22 5.1 0.1 0.0 0.0 0.0 73 0.3 395 2 395 0 oracle/1
27956 oracle 23 5.4 0.1 0.0 0.0 0.0 71 0.3 420 3 420 0 oracle/1
27956 oracle 28 6.6 0.1 0.0 0.0 0.0 65 0.4 510 4 512 0 oracle/1
27956 oracle 25 5.9 0.1 0.0 0.0 0.0 68 0.4 454 4 454 0 oracle/1
27956 oracle 24 5.6 0.1 0.0 0.0 0.0 70 0.3 430 5 430 0 oracle/1
27956 oracle 26 6.1 0.1 0.0 0.0 0.0 67 0.4 473 5 473 0 oracle/1
27956 oracle 26 6.2 0.1 0.0 0.0 0.0 67 0.4 474 5 474 0 oracle/1
27956 oracle 30 6.7 0.1 0.0 0.0 0.0 63 0.4 524 5 524 0 oracle/1
27956 oracle 27 6.3 0.1 0.0 0.0 0.0 66 0.4 489 4 491 0 oracle/1
27956 oracle 24 5.6 0.1 0.0 0.0 0.0 70 0.4 432 5 432 0 oracle/1
27956 oracle 29 6.8 0.1 0.0 0.0 0.0 63 0.4 530 4 530 0 oracle/1
27956 oracle 28 6.3 0.1 0.0 0.0 0.0 65 0.4 477 2 477 0 oracle/1
27956 oracle 27 6.3 0.1 0.0 0.0 0.0 66 0.4 488 3 488 0 oracle/1
27956 oracle 28 6.5 0.1 0.0 0.0 0.0 65 0.4 508 4 508 0 oracle/1
27956 oracle 33 7.1 0.1 0.0 0.0 0.0 60 0.4 544 3 547 0 oracle/1
27956 oracle 29 6.0 0.1 0.0 0.0 0.0 64 0.4 457 6 456 0 oracle/1
27956 oracle 29 6.0 0.1 0.0 0.0 0.0 65 0.4 464 5 464 0 oracle/1
27956 oracle 29 6.3 0.1 0.0 0.0 0.0 64 0.4 476 7 476 0 oracle/1
27956 oracle 24 5.1 0.1 0.0 0.0 0.0 70 0.3 394 3 394 0 oracle/1
27956 oracle 27 5.9 0.1 0.0 0.0 0.0 67 0.4 452 5 452 0 oracle/1
27956 oracle 32 7.1 0.1 0.0 0.0 0.0 61 0.4 549 4 551 0 oracle/1
27956 oracle 28 6.5 0.1 0.0 0.0 0.0 64 0.4 499 3 499 0 oracle/1
27956 oracle 23 5.2 0.1 0.0 0.0 0.0 71 0.3 403 4 403 0 oracle/1
27956 oracle 28 5.6 0.1 0.0 0.0 0.0 66 0.4 431 3 431 0 oracle/1
27956 oracle 26 4.7 0.1 0.0 0.0 0.0 68 0.3 363 4 363 0 oracle/1
Test 1.B & DB_FILE_MULTIBLOCK_READ_COUNT=128
SQL> alter session set DB_FILE_MULTIBLOCK_READ_COUNT=128;
Session altered.
SQL> select count(*) from huge_table;
^Cselect count(*) from huge_table
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
prstat -mLc -p 27956 1 100 | grep 27956
27956 oracle 6.4 0.4 0.0 0.0 0.0 0.0 93 0.0 21 0 26 0 oracle/1
27956 oracle 28 4.3 0.0 0.0 0.0 0.0 68 0.1 73 2 73 0 oracle/1
27956 oracle 32 5.1 0.0 0.0 0.0 0.0 63 0.1 84 6 86 0 oracle/1
27956 oracle 33 5.0 0.0 0.0 0.0 0.0 62 0.1 85 5 86 0 oracle/1
27956 oracle 32 4.8 0.0 0.0 0.0 0.0 63 0.1 83 4 82 0 oracle/1
27956 oracle 29 4.5 0.0 0.0 0.0 0.0 66 0.1 75 4 75 0 oracle/1
27956 oracle 33 5.1 0.0 0.0 0.0 0.0 62 0.1 87 5 87 0 oracle/1
27956 oracle 34 5.2 0.0 0.0 0.0 0.0 61 0.1 89 3 89 0 oracle/1
27956 oracle 33 5.1 0.0 0.0 0.0 0.0 62 0.1 86 6 89 0 oracle/1
27956 oracle 32 4.8 0.0 0.0 0.0 0.0 63 0.1 83 2 83 0 oracle/1
27956 oracle 30 4.5 0.0 0.0 0.0 0.0 65 0.1 77 5 77 0 oracle/1
27956 oracle 28 4.4 0.0 0.0 0.0 0.0 67 0.1 74 3 73 0 oracle/1
27956 oracle 22 3.4 0.0 0.0 0.0 0.0 74 0.1 58 4 58 0 oracle/1
27956 oracle 29 4.4 0.0 0.0 0.0 0.0 66 0.1 72 9 72 0 oracle/1
27956 oracle 33 5.0 0.0 0.0 0.0 0.0 62 0.1 85 3 87 0 oracle/1
27956 oracle 26 4.0 0.0 0.0 0.0 0.0 70 0.1 68 5 68 0 oracle/1
27956 oracle 26 3.9 0.0 0.0 0.0 0.0 70 0.1 63 7 63 0 oracle/1
27956 oracle 34 4.6 0.0 0.0 0.0 0.0 61 0.1 78 5 78 0 oracle/1
27956 oracle 31 4.2 0.0 0.0 0.0 0.0 65 0.1 70 5 70 0 oracle/1
27956 oracle 34 5.0 0.0 0.0 0.0 0.0 61 0.1 83 4 84 0 oracle/1
27956 oracle 29 4.4 0.0 0.0 0.0 0.0 66 0.1 67 5 68 0 oracle/1
27956 oracle 27 4.1 0.0 0.0 0.0 0.0 68 0.1 68 3 68 0 oracle/1
27956 oracle 30 4.5 0.0 0.0 0.0 0.0 65 0.1 76 4 76 0 oracle/1
27956 oracle 30 4.5 0.0 0.0 0.0 0.0 65 0.1 76 5 76 0 oracle/1
27956 oracle 37 4.7 0.0 0.0 0.0 0.0 58 0.1 80 5 80 0 oracle/1
27956 oracle 39 5.5 0.0 0.0 0.0 0.0 55 0.1 87 5 90 0 oracle/1
27956 oracle 37 5.3 0.0 0.0 0.0 0.0 57 0.1 92 3 91 0 oracle/1
27956 oracle 33 4.8 0.0 0.0 0.0 0.0 62 0.1 81 4 81 0 oracle/1
27956 oracle 34 4.3 0.0 0.0 0.0 0.0 61 0.1 71 4 71 0 oracle/1
27956 oracle 41 4.9 0.0 0.0 0.0 0.0 54 0.1 80 4 81 0 oracle/1
27956 oracle 33 4.5 0.0 0.0 0.0 0.0 63 0.1 74 4 73 0 oracle/1
27956 oracle 34 4.7 0.0 0.0 0.0 0.0 61 0.1 78 4 80 0 oracle/1
27956 oracle 32 4.2 0.0 0.0 0.0 0.0 64 0.1 72 5 72 0 oracle/1
27956 oracle 33 4.2 0.0 0.0 0.0 0.0 62 0.1 67 6 67 0 oracle/1
27956 oracle 32 3.8 0.0 0.0 0.0 0.0 65 0.1 61 4 61 0 oracle/1
27956 oracle 35 4.2 0.0 0.0 0.0 0.0 61 0.1 72 5 72 0 oracle/1
27956 oracle 28 4.3 0.0 0.0 0.0 0.0 68 0.1 74 5 74 0 oracle/1
27956 oracle 23 3.9 0.0 0.0 0.0 0.0 73 0.1 65 4 67 0 oracle/1
27956 oracle 27 4.3 0.0 0.0 0.0 0.0 68 0.1 72 4 72 0 oracle/1
27956 oracle 21 3.4 0.0 0.0 0.0 0.0 75 0.1 58 2 58 0 oracle/1
27956 oracle 30 4.2 0.0 0.0 0.0 0.0 66 0.1 69 4 69 0 oracle/1
27956 oracle 29 4.2 0.0 0.0 0.0 0.0 67 0.1 72 3 73 0 oracle/1
27956 oracle 25 4.0 0.0 0.0 0.0 0.0 71 0.1 69 5 68 0 oracle/1
27956 oracle 24 3.9 0.0 0.0 0.0 0.0 72 0.1 62 2 64 0 oracle/1
27956 oracle 29 4.2 0.0 0.0 0.0 0.0 66 0.1 72 5 72 0 oracle/1
27956 oracle 31 4.0 0.0 0.0 0.0 0.0 65 0.1 66 3 66 0 oracle/1
27956 oracle 27 4.3 0.0 0.0 0.0 0.0 69 0.1 71 4 71 0 oracle/1
Test 2: oracle returns all the data in a block to client side, sql*net is the bottle neck
SQL> set autotrace traceonly stat
SQL> select * from test_net1;
100000 rows selected.
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11481 consistent gets
0 physical reads ==> No PIO, if PIO involved, then cpu usage will be even lower.
0 redo size
34895444 bytes sent via SQL*Net to client
73814 bytes received via SQL*Net from client
6668 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100000 rows processed
prstat -mLc -p 27956 1 100 | grep 27956
27956 oracle 2.8 0.5 0.0 0.0 0.0 0.0 97 0.1 77 1 629 0 oracle/1
27956 oracle 5.4 0.9 0.1 0.0 0.0 0.0 94 0.2 180 2 1K 0 oracle/1
27956 oracle 5.4 1.0 0.1 0.0 0.0 0.0 93 0.1 172 0 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 1 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 2 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.1 172 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 2 1K 0 oracle/1
27956 oracle 5.5 1.0 0.1 0.0 0.0 0.0 93 0.1 173 2 1K 0 oracle/1
27956 oracle 5.7 1.1 0.1 0.0 0.0 0.0 93 0.2 173 0 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.2 174 2 1K 0 oracle/1
27956 oracle 5.4 1.1 0.1 0.0 0.0 0.0 93 0.1 170 2 1K 0 oracle/1
27956 oracle 5.4 1.2 0.1 0.0 0.0 0.0 93 0.1 170 2 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.1 171 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 171 1 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 171 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.2 174 1 1K 0 oracle/1
27956 oracle 5.6 1.2 0.1 0.0 0.0 0.0 93 0.1 170 3 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.1 171 3 1K 0 oracle/1
27956 oracle 5.4 1.0 0.1 0.0 0.0 0.0 93 0.1 172 1 1K 0 oracle/1
27956 oracle 5.4 1.0 0.1 0.0 0.0 0.0 93 0.1 172 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 171 3 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 1 1K 0 oracle/1
27956 oracle 5.7 1.1 0.1 0.0 0.0 0.0 93 0.2 171 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.2 172 1 1K 0 oracle/1
27956 oracle 5.5 1.0 0.1 0.0 0.0 0.0 93 0.1 171 1 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.2 172 2 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.2 173 2 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.1 173 1 1K 0 oracle/1
27956 oracle 5.4 1.3 0.1 0.0 0.0 0.0 93 0.1 170 1 1K 0 oracle/1
27956 oracle 5.5 1.2 0.1 0.0 0.0 0.0 93 0.1 171 3 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 173 1 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 171 1 1K 0 oracle/1
27956 oracle 5.5 1.3 0.1 0.0 0.0 0.0 93 0.2 170 4 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 1 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.1 172 1 1K 0 oracle/1
27956 oracle 5.5 1.4 0.1 0.0 0.0 0.0 93 0.1 170 1 1K 0 oracle/1
27956 oracle 5.5 1.1 0.1 0.0 0.0 0.0 93 0.2 172 1 1K 0 oracle/1
27956 oracle 5.6 1.1 0.1 0.0 0.0 0.0 93 0.2 173 0 1K 0 oracle/1
27956 oracle 5.7 1.1 0.1 0.0 0.0 0.0 93 0.2 172 1 1K 0 oracle/1
27956 oracle 2.4 0.4 0.0 0.0 0.0 0.0 97 0.1 65 0 517 0 oracle/1
27956 oracle 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 oracle/1
27956 oracle 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 oracle/1
27956 oracle 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 oracle/1
27956 oracle 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 oracle/1