oracle sql tuning 9--理解优化器访问路径

本文详细介绍了数据库中的不同访问路径,包括全表扫描、Rowid扫描和索引扫描等,并探讨了每种路径适用的场景及优化器如何选择访问路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问路径:说是是如何从数据库中取数据,一般说来对于表的小部分数据用到索引访问,对于访问表的大部分数据全表扫描更有效。

在OLTP系统中,有些SQL是小的[我理解为操作数据量不大的]那些SQL,可用索引来访问,相反在 Decision support systems中,使用分区表,全表扫描相关分区或许更好。

需要了解以下访问路径:

Full Table Scans

Rowid Scans

Index Scans

Cluster Access

Hash Access

Sample Table Scans

How the Query Optimizer Chooses an Access Path

Full Table Scan?

这种扫描方式过虑掉那些SELECT中不需要的数据,读取表中所有行,当执行全表扫描的时候,表中所有在高水位标记下的块被扫描,高水位标记暗示了表使用的空间情况.或者说空间被表中数据格式化.每一行都被检查,以发现表中数据是不是和where条件中的相符。

当oracle执行全表扫描的时候,所有的块被顺序读.I/O calls larger than a single block can be used to speed up the process. 参DB_FILE_MULTIBLOCK_READ_COUNT决定读取块的大小.使用多块读全表扫描将更有效。每一个块只读一次.

为什么说全表扫描在访问大数据量的时候很有效?

因为全表扫描使用比较大的IO调用,这种大的IO调用,比调用多个小的IO花费的代价要小些[原文:This is because full table scans can use larger I/O calls, and making fewer large I/O calls is cheaper than making many smaller calls]

那么何时使用全表扫描呢?

1.缺少索引

如果查询语句中没有使用到现在的索引,就会用全表扫描.如果说索引列上使用了索引,那么优化器也会执行全表扫描。比如:upper(index列)

2.访问数据量很大时

当优化器认为:你要取的数据,将需要访问表中的绝大多数块时,它就会走全表扫描。尽管如此,通过索引来访问往往更好.

3.足够小的表

当表包含的块数据小于参数DB_FILE_MULTIBLOCK_READ_COUNT 的大小,在高水位标记以下。一次IO操作就可以把表中数据读取,这个时候全表扫描就很有效。

4. high degree of parallelism

A high degree of parallelism for a table skews the optimizer toward full table scans over range scans. Examine the DEGREE column in ALL_TABLES for the table to determine the degree of parallelism.

5.使用hint full(table 别名)强制优化器走全表扫描.

6.并行查询的时候

当全表扫描的时候,响应时间可以通过并行这个特点来缩小。并行查询一般应用于数据仓库环境.

Rowid Scans?

表中第一行的ROWID指定的该行的数据文件,块(包含该行在块中的位置).通过rowid来定位表中数据是最快的,因为数据库中第一行确切的位置是指定好的。

当使用rowid方式来访问表的时候,ORACLE先获取SELECT语句中那些行的ROWID,通过WHERE条件或者是索引扫描,然后定位选择的每一行.

index scans?

这种方式下,一行数据被取回,通过语句中指定的索引。为了进行索引扫描,ORACLE查找索引列上的索引,如果语句访问的只是索引列,那就直接读取索引

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-629974/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15720542/viewspace-629974/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值