首页 > 开发 > 综合 > 正文

让你的连接查询加速

2024-07-21 02:39:20
字体:
来源:转载
供稿:网友

  Oracle9i引入了一种新的方法来加速对大型数据仓表格的连接(join)查询。这种新的方法,即位图连接索引(bitmap join index),要求创建一个索引,有这个索引在它被创建的时候进行合并操作,然后为连接中用到的要害字创建一个位图索引。
  
  位图连接索引背后的技术其实是把低基数数据列预先连接在一起,这样就让整体的连接(操作)进行得更快。在本文的例子里,我们将使用一个零件和供给商之间的多对多关系。每个零件都由多个供给商供给,而每个供给商能够提供多种零件。这个数据库里有200种不同类型的零件,供给商可以在(美国)所有50个州供给零件。
  
  要创建一个位图连接索引,我们要使用下面的SQL。要注重CREATE INDEX句法里的FROM和WHERE子句。
  
  create bitmap index
    part_suppliers_state
  on
    inventory( parts.part_type, supplier.state)
  from
    inventory i,
    parts   p,
    supplier s
  where
    i.part_id = p.part_id
  and
    i.supplier_id = p.part_id;
  
  尽管b-tree索引被用在标准的交叉记录(junction record)里,但是我们能够提高Oracle9i查询的性能,在这些查询里判定述词(PRedicate)会用到低基数数据列。例如,看看下面的查询,我们可以通过这个查询来获得北卡罗来纳的所有火花塞供给商:
  
  select
    supplier_name
  from
    parts
  natural join
    inventory
  natural join
    suppliers
  where
    part_type = 'piston'
  and
    state = 'nc'
  ;
  
  在Oracle9i之前的版本里,这个查询会需要一个对所有三个表格进行嵌套循环连接(nested loop join)或者散列连接(hash join)。而在Oracle9i里,我们可以根据低基数数据列将这三个表格预先连接。
  
  Oracle宣称,当所有的查询数据都驻留在索引之内的时候,使用这种索引方法能够把表格连接的速度提高7倍以上。然而在很多情况下,传统的散列连接或者嵌套循环连接可能会比位图连接做得更好。
  
  位图连接不是一副万能药。下面就是索引的一些局限性:
  
  1.被索引的数据列必须是低基数的——通常要少于300个完全不同的值。
  2.在WHERE子句里,查询绝对不能索引哪些没有包含在索引里的数据列。
  3.更新位图连接索引所需要的代价是相当高的。从实用的角度讲,位图连接索引被抛弃,而在天天晚上进行每日批量加载任务的时候才被重建。只有对于那些在处理的时候保持只读的Oracle数据仓,位图连接索引才会起作用。
  
  总而言之,位图连接索引会极大地提高特定数据仓查询的速度,但是其代价是在为图索引创建的时候,需要预先连接表格。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表