当前位置: 首页>数据库>正文

postgresql 全表扫描 索引优化 索引和全表扫描

1 Oracle中访问表的方法:

全表扫描

全表扫描是指Oracle中访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始。一直扫描到该表的高水位线。Oracle在做全表扫描时,会使用多块读,这在目标的数量不大时,执行效率是非常高的。但是全表扫描的问题在于目标sql的执行时间不稳定,不可控,这个执行时间一定会随着目标数据量的递增而递增。
delete数据时,并不会降低高水位线,使用delete删除表中的数据,然后进行全表扫描时,并不会增高全表扫描的效率。

rowid 扫描
rowid 扫描是指Oracle在访问目标表里的数据时,直接通过数据所在的rowid去定位并访问这些数据。rowid表示的是Oracle中数据行记录所在的物理存储地址,也就是说rowid实际上是和Oracle中数据块里的行记录一一对应。
rowid扫描有两种含义:
一种是根据用户在sql语句中输入的rowid的值直接去访问对应的数据行记录。
另外一种就是先去访问相关的索引,然后根据访问索引后得到的rowid再回表去访问相对应的数据行记录。

2 访问B树索引的方法

索引唯一扫描 index unique scan
索引唯一扫描 index unique scan 是针对惟一性索引 unique index的扫描,它仅仅适用与where条件里 等值查询的目标sql。

索引范围扫描 index range scan
当扫描的对象是唯一索引时,此时目标sql用的where条件一定是范围查询;
当扫描的对象是非唯一索引时,对目标的where条件没有限制,可以是等值查询也可以非等值查询。

索引全扫描 index full scan

适用于所有的B树索引(唯一性索引和非唯一性索引)。索引全扫描,就是指要扫描目标索引所有叶子块的所有索引行。但这并不意味着需要扫描该索引的所有分支块。在默认情况下,Oracle在做索引全扫描时,只需要访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引,就可以利用叶子块之间的双向指针链表,从左至右依顺序扫描该索引所有叶子块的所有索引行了。
索引全扫描的执行结果是有序的。
Oracle中能做索引全扫描的前台条件时目标索引至少有i个索引键之列的属性是not null。

索引快速扫描 index fast full scan
索引快速扫描和索引全扫描相比有三点区别:
1 索引快速扫描只适用于CBO
2 索引快速扫描可以使用多块度读,也可以并行执行。
3 索引快速扫描不一定是有序的,因为使用了多块读。

索引跳跃扫描:

适用于所有的B数索引
它使那些在where条件中没有目标索引的前导列指定查询条件但同时又对该索引的非前导列
指定了查询条件的目标sql依然可以使用上该索引。这就像是在扫描该索引时跳过了它的前导列,直接从该索引的非前导列开始扫描一样。(实际执行过程并非如此)
因为Oracle对该索引的前导列的distinct值做了遍历。
Oracle中的索引跳跃扫描仅仅适用于那些目标索引前导列的distinct值的数量较少,后续非前导列的可选择性有非常好的情形,因为索引跳跃扫描的执行效率一定会随着目标索引的前导列的distinct值数量的递增而递减。



https://www.xamrdz.com/database/6v51959947.html

相关文章: