oracle 表之间的链接

  排序 - - 合并链接(Sort Merge Join, SMJ):
  a) 对于非等值链接,这种链接方式的效率是比较高的。
  b) 若是在关联的列上都有索引,效果更好。
  c) 对于将2个较大的row source作链接,该链接方法比NL链接要好一些。
  d) 可是若是sort merge返回的row source过大,则又会致使使用过多的rowid在表中查询数据时,数据库性能降低,由于过多的I/O.

  嵌套循环(Nested Loops, NL):
  a) 若是driving row source(外部表)比较小,而且在inner row source(内部表)上有惟一索引,或有高选择性非惟一索引时,使用这种方法能够获得较好的效率。
  b) NESTED LOOPS有其它链接方法没有的的一个优势是:能够先返回已经链接的行,而没必要等待全部的链接操做处理完才返回数据,这能够实现快速的响应时间。

  哈希链接(Hash Join, HJ):
  a) 这种方法是在oracle7后来引入的,使用了比较先进的链接理论,通常来讲,其效率应该好于其它2种链接,可是这种链接只能用在CBO优化器中,并且须要设置合适的hash_area_size参数,才能取得较好的性能。
  b) 在2个较大的row source之间链接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
  c) 只能用于等值链接中
 
  Oracle执行计划的相关概念:

  Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内惟一。
  Recursive sql:为了执行用户语句,系统附加执行的额外操做语句,譬如对数据字典的维护等。
  Row source(行源):oracle执行步骤过程当中,由上一个操做返回的符合条件的行的集合。
  Predicate(谓词):where后的限制条件。
  Driving table(驱动表):又称为链接的外层表,主要用于嵌套与hash链接中。通常来讲是将应用限制条件后,返回较少行源的表做为驱动表。在后面的描述中,将driving table称为链接操做的row source 1。
  Probed table(被探查表):链接的内层表,在咱们从driving table获得具体的一行数据后,在probed table中寻找符合条件的行,因此该表应该为较大的row source,而且对应链接条件的列上应该有索引。在后面的描述中,通常将该表称为链接操做的row source 2.
  Concatenated index(组合索引):一个索引若是由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。
  可选择性:表中某列的不一样数值数量/表的总行数若是接近于1,则列的可选择性为高。

  Oracle访问数据的存取方法:
 
  Full table scans, FTS(全表扫描):经过设置db_block_multiblock_read_count能够设置一次IO能读取的数据块个数,从而有效减小全表扫描时的IO总次数,也就是经过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描状况下才能使用多块读操做。
  Table Access by rowed(经过rowid存取表,rowid lookup):因为rowid中记录了行存储的位置,因此这是oracle存取单行数据的最快方法。
  Index scan(索引扫描index lookup):在索引中,除了存储每一个索引的值外,索引还存储具备此值的行对应的rowid值,索引扫描分两步1,扫描索引获得rowid;2,经过 rowid读取具体数据。每步都是单独的一次IO,因此若是数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率降低不少。而若是结果数据可以所有在索引中找到,则能够避免第二步操做,从而加快检索速度。
  根据索引类型与where限制条件的不一样,有4种类型的索引扫描:
  Index unique scan(索引惟一扫描):存在unique或者primary key的状况下,返回单个rowid数据内容。
  Index range scan(索引范围扫描):1,在惟一索引上使用了range操做符(>,<,<>,>=,<=,between);2,在组合索引上,只使用部分列进行查询;3,对非惟一索引上的列进行的查询。
  Index full scan(索引全扫描):须要查询的数据从索引中能够所有获得。
  Index fast full scan(索引快速扫描):与index full scan相似,可是这种方式下不对结果进行排序。

  目前为止,典型的链接类型有3种:
 
  Sort merge join(SMJ排序-合并链接):首先生产driving table须要的数据,而后对这些数据按照链接操做关联列进行排序;而后生产probed table须要的数据,而后对这些数据按照与driving table对应的链接操做列进行排序;最后两边已经排序的行被放在一块儿执行合并操做。排序是一个费时、费资源的操做,特别对于大表。因此smj一般不是一个特别有效的链接方法,可是若是driving table和probed table都已经预先排序,则这种链接方法的效率也比较高。
  Nested loops(NL嵌套循环):链接过程就是将driving table和probed table进行一次嵌套循环的过程。就是用driving table的每一行去匹配probed table 的全部行。Nested loops能够先返回已经链接的行,而没必要等待全部的链接操做处理完成才返回数据,这能够实现快速的响应时间。
  Hash join(哈希链接):较小的row source被用来构建hash table与bitmap,第二个row source用来被hashed,并与第一个row source生产的hash table进行匹配。以便进行进一步的链接。当被构建的hash table与bitmap能被容纳在内存中时,这种链接方式的效率极高。但须要设置合适的hash_area_size参数且只能用于等值链接中。
  另外,还有一种链接类型:Cartesian product(笛卡尔积):表的每一行依次与另一表的全部行匹配,通常状况下,尽可能避免使用。
相关文章
相关标签/搜索