一条select语句发出后,ORACLE会计算出需要读取哪些BLOCK,拿一个BLOCK来说,根据块地址HASH以后,计算出块所在的cache buffer chain,然后搜索这个链表,如果在链表中存在,释放cache buffer chain,PIN住这个链表中的块,然后根据客户端的arraysize设置抓取相应的记录数,然后释放PIN,这就是一个逻辑读,如果还需要这个块的其余记录,那么重复这个过程,又是一个逻辑读,因此一个块可能有N此逻辑读。如果块在链表中不存在,那就物理读取,然后再获取cache buffer chain,....因此我们将arraysize设置成一个较大的值是一个不错的选择,最佳值是刚好等于这个块中的记录数,可是往往每个块的记录数都是不一样的。设置的值超过了一个块所能容纳的最大记录数是没有意义的。
如果测试语句中如果包含count(*)之类的聚合函数,arraysize将不会再起作用了,ORACLE内部会一次性抽取块中的所有行。
SQL> set arraysize 15
SQL> select count(*) from test;
已用时间: 00: 00: 00.00
执行计划
----------------------------------------------------------
Plan hash value: 1950795681
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 153 (2)| 00:00:02 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST | 51669 | 153 (2)| 00:00:02 |
-------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
688 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> set arraysize 100
SQL> select count(*) from test;
已用时间: 00: 00: 00.02
执行计划
----------------------------------------------------------
Plan hash value: 1950795681
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 153 (2)| 00:00:02 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST | 51669 | 153 (2)| 00:00:02 |
-------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
688 consistent gets
1 physical reads
0 redo size
410 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> set arraysize 200
SQL> select count(*) from test;
已用时间: 00: 00: 00.00
执行计划
----------------------------------------------------------
Plan hash value: 1950795681
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 153 (2)| 00:00:02 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST | 51669 | 153 (2)| 00:00:02 |
-------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
688 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22034023/viewspace-668309/
,如需转载,请注明出处,否则将追究法律责任。