文档介绍:oracle,分区,执行计划 1·rowid,伪列:就是系统自己给加上的,每个表都有一个伪列,并不是物理存在。它不能被修改,删除,和添加,rowid在该行的生命周期是唯一的,如果向数据库插入一列,只会引起行的变化,但是rowid并不会变。 2·recursivesql概念:当用户执行一些SQL语句时,会自动执行一些额外的语句,我们把这些额外的SQL语句称为“recursivecalls”或者是“recursivesqlstatement”,当在执行一个DDL语句时,Oracle总会隐含的发出一些Recursivsql语句,用于修改数据字典,如果数据字典没有在共享内存中,则就执行“resursivecalls”,它会把数据字典从物理读取到共享内存。当然DML和select语句都可能引起recursiveSQL。 3·rowsource行源:在查询中,由上一操作返回的符合条件的数据集,它可能是整个表,也可能是部分,当然也可以对2个表进行连接操作最后得到的数据集4·predicate:一个查询中的where限制条件 5·drivingtable驱动表:该表又成为外层表,这个感念用于内嵌和HASH连接中,如果返回数据较大,会有负面影响,返回行数据较小的适合做驱动表 6·probedtable被探查表:该表又称为内层表,我们在外层表中取得一条数据,在该表中寻找符合连接的条件的行。 7·组合索引由多个列组成的索引,在组合索引中有一个重要的概念,就是引导索引, createindexidx_tabontab(col1,col2,col3), indx_tab则称为组合索引, col1则称为引导列在查询条件where后,必须使用引导索引,才会使用该组合索引 ,就可以判断该列的可选择性。如果该列的“唯一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进行查询时,返回的数据就较少,比较适合使用索引查询。 (Fulltabelscans,FTS) 为了实现全表扫描,Oracle读取数据库中的每一行,并检查每一行是否满足语句的where限制条件一个多块读操作,可以使io能读取多块数据块。减少了IO次数,提高了系统的吞吐量。在多块读的方法的使用下,可以高效的实现数据库全表扫描,而且,中有在全表扫描的情况下,在可以使用多块读的方法。在这个种访问模式下,数据块只读一次。【注意】使用FTS的前提是,在较大的表中,不建议使用FTS,除非取出的数据较多,超过总量的5%-10%,或者使用并行查询时 ,数据块,以及在数据块中的位置,使用rowid能快速的定位到要取得数据的行上,在Oracle中,这是取得单行最快的方式。【注意】该存取方法,不会用到多块读操作,一次IO只能读取一个数据块。 (indexscan和indexlookup) 索引扫描时通过index查找到对应行的rowid,然后通过rowid从数据库中得到具体的数据。该方法分为两个步骤, 扫描索引得到得到rowid 说明:索引中不止储存着索引值,还存放的行的rowid 通过rowid得到表中的数据【注意】 ,因此绝大多数都Cache到内存当中,所以第一步通常是逻辑IO,即数据可以从内存中取得 ,如果数据比较大,就不可能存放在内存,因此是个物理操作,是极其耗时间的,因此,从大表中进行索引扫描,如果数量大于总数的5%-10%,则效力会下降很多 ,就可以避免第二步操作,避免了不必要的IO。效力会很高。 ,因为索引已经预先排好了序,索引在执行计划中不需要在对索引排序。根据索引的类型与where限制条件的不同,有4种数据类型的索引 (indexuniquescan) 通过唯一索引查找一个数值,通常是rowid,如果表中存在unique,或者是primarykey的话,Oracle通常实现唯一索引; ,通常在唯一索引上加上范围操作,例如*使用indexrangscan的三种情况(a)在唯一索引上有where条件筛选(b)在组合索引上,使用部分列进行查询,导致查询出多行(c)对非唯一索引列进行的任何查询 (indexfullscan) 与全表扫描想对应的就是全索引扫描,它必要保证要取得的数据都从索引中直接得到例: IndexBE_IXisaconcatenatedindexonbi