热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

编写高效的pl/sql代码一例——rowid的使用

来源: 作者: 时间:2007-12-06 Tag: 点击:
一、原理介绍:
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.使用索引的执行计划:
SQL>  explain plan
  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  |       |       |       |
--------------------------------------------------------------------
 
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';
 
已解释。


相关文章:
SQLite3 C/C++ 开发接口简介(API函数) 二
SQLite3 使用教学
Scaling out MySQL - Hardware today and tomorro
SQLite适用的范围
sybase cursor declare
SQL语句大全精要
用户配额
decode函数
Oracle 数据库创建表空间、创建用户指定表空间
MySQL教会我使用GnuPG验证软件包
MySQL中MyISAM引擎与InnoDB引擎性能简单测试
initdb
mysqladmin在线帮助文档
CentOS 4.7 安装Oracle 9.2.0.4的一些问题
文本如何导入oracle(sqlldr 的用法)
ORA-00600: 内部错误代码,自变量: [16201], [],
分布式Oracle的database link
install a MySQL source distribution
Mysql备份脚本(未验证)
oracle 9.2.0.1 update 9.2.0.5
每小时Dump所有mysql数据库到NAS存储设备上
Oracle SCN机制解析
Account LOCKED(TIMED)
MySQL数据库5.0的my.cnf配置选项
oracle存储过程中调用其他用户的表
修改sqlplus提示符
MYSQL建表实例
一些对Mysql DBA有用的脚本
Oracle DBA 强悍挑战OS 64位 Solaris 10-真正休
[Bugzilla]由Mysql迁移到Oracle的方法