oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍

41528d3028836879cd698677c3999917.gifSQL Server和Oracle数据库索引介绍

SQL Server 和 Oracle 数据库索引介绍1 SQL Server 中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。表或视图可以包含以下类型的索引:聚集索引聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。每个表几乎都对列定义聚集索引来实现下列功能:1、可用于经常使用的查询。2、提供高度唯一性。在创建聚集索引之前,应先了解数据是如何被访问的。考虑对具有以下特点的查询使用聚集索引:使用运算符(如 BETWEEN、、=、 SELECT * from hr.jobs 2 WHERE job_title between a and ZZZZZZZZZZZ ; cution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=33) 1 0 FILTER 2 1 TABLE ACCESS (FULL) OF JOBS (Cost=2 Card=1 Bytes=33) SQL DROP INDEX IDX_jobs_title ; SQL CREATE INDEX IDX_jobs_title on hr.jobs (job_title ); SQL Select * FROM hr.jobs 2 Where job_title between a and ZZZZZZZZZZZ ; cution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=33) 1 0 FILTER 2 1 TABLE ACCESS (FULL) OF JOBS (Cost=2 Card=1 Bytes=33)位图索引位图索引(bitmap index)是从 Oracle7.3 版本开始引入的。目前 Oracle 企业版和个人版都支持位图索引,但标准版不支持。位图索引是为数据仓库/在线分析查询环境设计的,在此所有查询要求的数据在系统实现时根本不知道。位图索引特别不适用于 OLTP 系统,如果系统中的数据会由多个并发会话频繁地更新,这种系统也不适用位图索引。位图索引是这样一种结构,其中用一个索引键条目存储指向多行的指针;这与 B*树结构不同,在 B*树结构中,索引键和表中的行存在着对应关系。在位图索引中,可能只有很少的索引条目,每个索引条目指向多行。而在传统的 B*树中,一个索引条目就指向一行。B* 树索引一般来讲应当是选择性的。与之相反,位图索引不应是选择性的,一般来讲它们应该“没有选择性“ 。如果有大量在线分析查询,特别是查询 以一种即席方式引用了多列或者会生成诸如 COUNT 之类的聚合,在这样的环境中,位图索引就特别有用 。位图索引使用 CREATE BITMAP INDEX index_name ON table_name(column_name1,column_name2) TABLESPACE tablespace_name 命令语法创建。SQL Server 查询优化技术及索引From: SQL Server 中,索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图:非聚簇索引 聚簇索引 聚簇索引与非聚簇索引的本质区别到底是什么?什么时候用聚簇索引,什么时候用非聚簇索引? 这是一个很复杂的问题,很难用三言两语说清楚。我在这里从 SQL Server 索引优化查询的角度简单谈谈 (如果对这方面感兴趣的话,可以读一读微软出版的《Microsoft SQL Server 2000 数据库编程》第 3 单元的数据结构引论以及第 6、13 、14 单元)。一、索引块与数据块的区别 大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用 1000 字节的话,我们对其中 10 字节的一个字段建立索引,那么该记录对应的索引块的大小只有 10 字节。我们知道,SQL Server的最小空间分配单元是“页(Page )”,一个页在磁盘上占用 8K 空间,那么这一个页可以存储上述记录 8 条,但可以存储索引 800 条。现在我们要从一个有 8000 条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历 8000 条×1000 字节/8K 字节=1000 个页面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以在 8000 条×10 字节/8K 字节=10 个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样 IO 访问量要少的多。二、索引优化技术 是不是有索引就一定检索的快呢?答案是否。有些时候用索引还不如不用索引快。比如说我们要检索上述表中的所有记录,如果不用索引,需要访问 8000 条×1000 字节/8K 字节=1000 个页面,如果使用索引的话,首先检索索引,访问 8000 条×10 字节/8K 字节=10 个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于是检索所有数据,所以需要再访问 8000 条×1000 字节/8K 字节=1000 个页面将全部数据读取出来,一共访问了 1010 个页面,这显然不如不用索引快。SQL Server 内部有一套完整的数据检索优化技术,在上述情况下,SQL Server 的查询计划(Search Plan)会自动使用表扫描的方式检索数据而不会使用任何索引。那么 SQL Server 是怎么知道什么时候用索引,什么时候不用索引的呢? SQL Server 除了日常维护数据信息外,还维护着数据统计信息,下图是数据库属性页面的一个截图:从图中我们可以看到,SQL Server 自动维护统计信息,这些统计信息包括数据密度信息以及数据分布信息,这些信息帮助 SQL Server 决定如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值