Oracle 12c中新增通过ROWID BATCHED访问数据块的方式,优化原来使用单个rowid进行数据块访问方式带来的资源消耗及对数据块的扫描次数,即TABLE ACCESS BY INDEX ROWID BATCHED特性。该特性通过隐藏参数“_optimizer_batch_table_access_by_rowid”控制,默认值为true,即默认开启。

以下是SELECT * FROMemployeesWHEREemployee_id > 190;的执行计划部分内容。

--------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
--------------------------------------------------------------------------------
|0|SELECTSTATEMENT||||2(100)||
|1|TABLEACCESSBYINDEXROWIDBATCHED|EMPLOYEES|16|1104|2(0)|00:00:01|
|*2|INDEXRANGESCAN|EMP_EMP_ID_PK|16||1(0)|00:00:01|
--------------------------------------------------------------------------------

PredicateInformation(identifiedbyoperationid):
---------------------------------------------------

2-access("EMPLOYEE_ID">190)

以上执行计划的步骤2显示了hr.employees表上emp_emp_id_pk索引的范围扫描。 数据库使用从索引获取的rowid来查找employees表中的相应行,然后检索它们。 步骤1中显示使用从索引中检索的rowid进行BATCHED访问,数据库将对从索引中检索的rowid进行排序,然后按块顺序访问行,从而减少数据库必须访问的块的次数以降低资源的消耗。