中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
让你的连接查询加速
作者:佚名 时间:2004-07-10 10:40 出处:互连网 责编:chinaitpower
              摘要:让你的连接查询加速

  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数据仓,位图连接索引才会起作用。
  
  总而言之,位图连接索引会极大地提高特定数据仓查询的速度,但是其代价是在为图索引创建的时候,需要预先连接表格。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有