rowid:一条记录的物理位置(一定唯一的,可用于删除重复记录)
dbms_rowid:
object_id->file_id->
block_id->row_id
block_id:最小I/O单位
Index记录了每条记录的rowid
create index testc1 on test (c1);
在test表的c1字段上建立一个testc1的索引。
Index->二叉排序树:叶子节点放的是key和rowid的对应关系
索引:
1.数据库对象-->user_indexs
2.Orcale用rowid来提高提取行记录的速度
3.通过快速路径访问方法来减少磁盘的I/O,从而实现快速数据定位
4.在物理上索引和表是独立的,逻辑上是相连的,drop table索引就不存在了,drop索引table还在,truncate table后索引结构没有了,但是索引本身存在。
5.索引的维护是系统自动做的。
索引维护的代价太高:尤其是DML中的update(先删除,在插入)代价最大
索引为select而生,牺牲了空间和维护为代价。
索引的创建:
自动创建:pk和uk建立。(唯一性索引)
手动建立:
建立索引的原则:
1.where子句中经常用到的,join 条件中(大表建立索引)
2.表大,查询的结构少
3.字段的值的重复率低
4.索引不维护空值,bitmap index维护空值
5.
空值的问题:子查询,
nvl
,排序,表达式,
is not null
set timing on
设置语句执行时间
set autotrace on
sqlplus uname/pwd @jiaoben.sql
a.
$ORACL_HOME/rdbms/admin/*plan*--->
普通用户执行
b.
$ORACL_HOME/sqlplus/admin/plustrace ---> sysdba
执行
c.
grant plustrace to username
d.
在
where
里不要写表达式,尽量不要用函数,否则索引用不了。
部分隐式数据类型转换
(
与使用函数是一样的
)
,所以尽量避免隐式数据类型转换发生。
is null
会做全表扫描。
like可以做全表范围内的扫描,开始的用字符,别用"%"。
基于函数的索引。函数转换要用在DML,也就是说在向表中录入数据时要录入干净的数据。
查询效率低的时候,先看是否做全表扫描。
能做DESC的table,view
dict
USER_VIEWS
View 相对于基表来说没有提高速度,但是操作简单了。View可以限制数据的访问,拼表(union,intersect,minus)。
union all 不会触发排序动作,union 要排重,所以要触发排序动作。如果union all和union结果相同,则要使用union all可以减少排序所带来的开销。
给view可以加约束。
复杂view可以用insted of 触发器来部分实现DML
with check option 设置插入条件(where 子句中的条件),不符合的就插入不进去。
with read only 只能做select
删除表后,相关的视图,函数,触发器,存储过程都会无效的。
full outer join: t1=t2(+) union t1(+)=t2
先做外连接,然后过滤。
过滤条件在内连接前先执行
sqlplus root/1234@
tarena20(
主机字符串
)
$ORACLE_HOME/network/admin
tnsnames.ora
文件中的:
tarena20={}
中的就是主机字符串。
Sqlplus uname/passwd (
不需要网络监听,是在本机进程间通信
)
Sqlplus uname/passwd@
主机字符串
(
需要通过监听程序来连接
)