Oracle执行计划
发布网友
发布时间:2023-02-11 08:25
我来回答
共1个回答
热心网友
时间:2023-04-24 13:30
每步都是一次单独的I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第一步的I/O经常是逻辑I/O,即数据可以从内存中得到。但对于第二部来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,极其费时间。所以如果对大表进行索引扫描,取出的数据如果大于总量的5%-10%,使用索引扫描效率会下降很多。但是如果查询的数据能全在索引中找到,就可以避免进行第二步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的。再者,如果sql语句中需要对索引列进行排序,因为索引已经预先排序好了,所以在执行计划索引进行排序。
根据索引的类型和where*条件的不同,一般有如下4中类型的索引扫描:
Join是一种试图将两个表结合在一起的谓词,一次只能连接两个表。Join可以并行的读取两个连接的表的数据,但将表中符合*条件的数据段读入内存形成row source后,join的其它步骤一般都是串行的。
目前为止,典型的join连接类型有3中:
如果row source已经在关联列上被排序,则该连结操作就不需要再进行sort操作,这样可以大大提高这种连接操作的连接速度,因为排序是个极其耗费资源的操作。预先排序的row source包括已经被索引的列或row source已经在前面的步骤中被排序了。另外,尽管合并两个row source的过程是串行的,但是可以并行访问这两个row source(如并行读入数据,排序)。
排序是一个费时,费资源的操作,基于这个原因,SMJ通常不是一种有效率的连接方式,但当row source已经排好序的前提下,SMJ的效率还是很可观的。
各连接方法试用的场景:
参考文献