oracle访问数据的方法:
访问表的方法:1.全表扫描,2.rowid扫描。
1.全表扫描:对某个表进行全表扫描是指访问表占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位线(HWM)。不是说全表扫描不好,事实上oracle在做全表扫描操作时会使用多块读,在目标表不大时执行效率很高。全表扫描存在的最大问题是目标sql执行时间不稳定,不可控,执行时间一定会随着目标表数据量的递增而递增。即使删除该目标表中数据,但是该目标表中的高水位线还是在删除前的位置,全扫描该表时oracle还是需要扫描该表高水位线下的所有数据块。
2.rowid扫描:oracle中的rowid扫描有两层含义:一种是根据用户在sql语句中输入的rowid的值直接去访问对应的数据行记录;另外一种是先去访问相关的索引,然后根据访问索引后得到的rowid再回表去访问对应的数据行记录。
访问索引的方法:1.索引唯一性扫描,2.索引范围扫描,3.索引全扫描,4.索引快速全扫描,5.索引跳跃式扫描。
1.索引唯一性扫描(INDEX UNIQUE SCAN):是针对唯一性索引的扫描,它仅仅适用于where条件里的等值查询的目标sql。
2.索引范围扫描(INDEX RANGE SCAN):索引扫描适用于所有类型的B树索引,当扫描的对象是唯一性索引时,此时目标sql的where条件一定是范围查询(between,<或>等);当扫描的对象是非唯一性索引时,对目标sql的where条件没有限制。
3.索引全扫描(INDEX FULL SCAN):适用于所有类型的B树索引。指扫描目标索引所有叶子快的所有索引行。通常情况下,索引全扫描是不需要回表的,所以索引全扫描适用于目标sql的查询列全部是目标索引的索引键值列的情形。
4.索引跳跃式扫描:适用于所有类型的复合B树索引,它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该索引的非前导列指定了查询条件的目标sql。oracle的索引跳跃式扫描仅仅适用于那些目标索引前导列的distinct值数量较少,后续非前导列的可选择性又非常好的情况,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减。
表连接顺序:
不管目标sql中有多少个表做表连接,oracle在实际执行该sql时只能先两两做表连接,在依次执行这样的两两表连接过程,直到目标sql中所有的表都已连接完毕。所以表连接顺序包含两层含义:一层含义是当两个表做表连接时,优化器需要决定这两个表中谁是驱动表,谁是被驱动表;另外一层含义是当多表做表连接时,优化器需要决定这些表中谁和谁先做表连接,然后再和其他表做表连接。
表连接方法:
在oracle中,两个表之间的表连接方法有排序合并连接,嵌套循坏连接,哈希连接和笛卡尔连接这四种连接