一、原理介绍:
pl/sql的主要功能是处理表中的数据,效率的提高主要是在数据的查询上。我们已经知道索引可以提高查询效率。那么,索引的原理是什么呢?
例如,创建表employee(first_name varchar2, last_name varchar2),并在employee.last_name上创建索引ind_e1。我们可以把索引ind_e1看做是另外一张表,它包含2列(last_name, rowid)。
我们发出的sql:update employee set first_name='h' where last_name='g';先从索引ind_e1上查询到该行的rowid,然后再根据rowid直接定位到该行数据所在的数据块和行。
那么很明显,我们直接使用rowid作为查询条件,会比使用索引有更高的执行效率,因为这样会跳过从索引中查询rowid的步骤。下面是一个图示:

下面我们用一个例子来看一下:
二、相关测试:
--0.创建表test1(a varchar2),在test1.a上创建唯一索引ind_test1_a。
过程略
SQL> select a, rowid from test1;
A ROWID
---------- ------------------
1 AAAHhNAALAAAAESAAA
2 AAAHhNAALAAAAESAAB
3 AAAHhNAALAAAAESAAC
---------- ------------------
1 AAAHhNAALAAAAESAAA
2 AAAHhNAALAAAAESAAB
3 AAAHhNAALAAAAESAAC
--1.使用索引的执行计划:
SQL> explain plan
2 for
3 update test1 set a = 22 where a = '2';
2 for
3 update test1 set a = 22 where a = '2';
已解释。
SQL> @%oracle_home%\rdbms\admin\utlxpls
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------
----------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | |
| 1 | UPDATE | TEST1 | | | |
|* 2 | INDEX UNIQUE SCAN | PK_TEST1_A | | | |
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | |
| 1 | UPDATE | TEST1 | | | |
|* 2 | INDEX UNIQUE SCAN | PK_TEST1_A | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
---------------------------------------------------
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------
----------------------------------------------------------------------
2 - access("TEST1"."A"='2')
Note: rule based optimization
已选择15行。
--2.使用rowid的执行计划:
SQL> explain plan
2 for
3 update test1 set a = 11 where rowid = 'AAAHhNAALAAAAESAAA';
2 for
3 update test1 set a = 11 where rowid = 'AAAHhNAALAAAAESAAA';
已解释。
0
