让你的连接查询加速

ZDNet软件频道 时间:2004-02-27 作者:Builder.com |  我要评论()
本文关键词:oracletips
Oracle9i引入了一种新的方法来加速对大型数据仓表格的连接(join)查询。这种新的方法,即位图连接索引要求创建一个索引,有这个索引在它被创建的时候进行合并操作,然后为连接中用到的关键字创建一个位图索引。
本文译自Builder.com,未经许可请勿转载

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数据仓,位图连接索引才会起作用。

总而言之,位图连接索引会极大地提高特定数据仓查询的速度,但是其代价是在为图索引创建的时候,需要预先连接表格。


本文作者: Donald Burleson做数据库管理员已经有23年了,曾经写过14本关于数据库的书和超过100篇的文章。他是《Oracle内幕(Oracle Internals)》的主编,并经营着Burleson Oracle咨询公司(Burleson Oracle Consulting)。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134