- 浏览: 29525 次
- 性别:
- 来自: 广州
最新评论
5.3 重建 B 树索引对于查询性能的影响
最后我们来看一下重建索引对于性能的提高到底会有什么作用。假设我们有一个表,该表具有 1 百万条记录,占用了 100000 个数据块。而在该表上存在一个索引,在重建之前的 pct_used 为 50% ,高度为 3 ,分支节点块数为 40 个,再加一个根节点块,叶子节点数为 10000 个;重建该索引以后, pct_used 为 90% ,高度为 3 ,分支节点块数下降到 20 个,再加一个根节点块,而叶子节点数下降到 5000 个。那么从理论上说:
1) 如果通过索引获取单独 1 条记录来说:
重建之前的成本: 1 个根+ 1 个分支+ 1 个叶子+ 1 个表块= 4 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 1 个叶子+ 1 个表块= 4 个逻辑读
性能提高百分比: 0
2) 如果通过索引获取 100 条记录(占总记录数的 0.01% )来说,分两种情况:
最差的 clustering_factor (即该值等于表的数据行数):
重建之前的成本: 1 个根+ 1 个分支+ 0.0001*10000 ( 1 个叶子)+ 100 个表块= 103 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.0001*5000 ( 1 个叶子)+ 100 个表块= 102.5 个逻辑读
性能提高百分比: 0.5% (也就是减少了 0.5 个逻辑读)
最好 clustering_factor (即该值等于表的数据块):
重建之前的成本: 1 个根+ 1 个分支+ 0.0001*10000 ( 1 个叶子)+ 0.0001*100000 ( 10 个表块)= 13 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.0001*5000 ( 1 个叶子)+ 0.0001*100000 ( 10 个表块)= 12.5 个逻辑读
性能提高百分比: 3.8% (也就是减少了 0.5 个逻辑读)
3) 如果通过索引获取 10000 条记录(占总记录数的 1% )来说,分两种情况:
最差的 clustering_factor (即该值等于表的数据行数):
重建之前的成本: 1 个根+ 1 个分支+ 0.01*10000 ( 100 个叶子)+ 10000 个表块= 10102 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.01*5000 ( 50 个叶子)+ 10000 个表块= 10052 个逻辑读
性能提高百分比: 0.5% (也就是减少了 50 个逻辑读)
最好 clustering_factor (即该值等于表的数据块):
重建之前的成本: 1 个根+ 1 个分支+ 0.01*10000 ( 100 个叶子)+ 0.01*100000 ( 1000 个表块)= 1102 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.01*5000 ( 50 个叶子)+ 0.01*100000 ( 1000 个表块)= 1052 个逻辑读
性能提高百分比: 4.5% (也就是减少了 50 个逻辑读)
4) 如果通过索引获取 100000 条记录(占总记录数的 10% )来说,分两种情况:
最差的 clustering_factor (即该值等于表的数据行数):
重建之前的成本: 1 个根+ 1 个分支+ 0.1*10000 ( 1000 个叶子)+ 100000 个表块= 101002 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.1*5000 ( 500 个叶子)+ 100000 个表块= 100502 个逻辑读
性能提高百分比: 0.5% (也就是减少了 500 个逻辑读)
最好 clustering_factor (即该值等于表的数据块):
重建之前的成本: 1 个根+ 1 个分支+ 0.1*10000 ( 1000 个叶子)+ 0.1*100000 ( 10000 个表块)= 11002 个逻辑读
重建之后的成本: 1 个根+ 1 个分支+ 0.1*5000 ( 500 个叶子)+ 0.1*100000 ( 10000 个表块)= 10502 个逻辑读
性能提高百分比: 4.5% (也就是减少了 500 个逻辑读)
5) 对于快速全索引扫描来说,假设每次获取 8 个数据块:
重建之前的成本:( 1 个根+ 40 个分支+ 10000 个叶子) / 8 = 1256 个逻辑读
重建之后的成本:(
1
个根+
40
个分支+
5000
个叶子)
/ 8
=
631
个逻辑读
性能提高百分比:
49.8%
(也就是减少了
625
个逻辑读)
从上面有关性能提高的理论描述可以看出,对于通过索引获取的记录行数不大的情况下,索引碎片对于性能的影响非常小;当通过索引获取较大的记录行数时,索引碎片的增加可能导致对于索引逻辑读的增加,但是索引读与表读的比例保持不变;同时,我们从中可以看到, clustering_factor 对于索引读取的性能有很大的影响,并且对于索引碎片所带来的影响具有很大的作用;最后,看起来,索引碎片似乎对于快速全索引扫描具有最大的影响。
我们来看两个实际的例子,分别是 clustering_factor 为最好和最差的两个例子。测试环境为 8KB 的数据块,表空间采用 ASSM 的管理 方式。先做一个最好的 clustering_factor 的例子,创建测试表并填充 1 百万条数据。
SQL> create table rebuild_test(id number,name varchar2(10)); SQL> begin 2 for i in 1..1000000 loop 3 insert into rebuild_test values(i,to_char(i)); 4 if mod(i,10000)=0 then 5 commit; 6 end if; 7 end loop; 8 end; 9 /
该表具有 1 百万条记录,分布在 2328 个数据块中。同时由于我们的数据都是按照顺序递增插入的,所以可以知道,在 id 列上创建的索引都是具有最好的 clustering_factor 值的。我们运行以下查询测试语句,分别返回 1 、 100 、 1000 、 10000 、 50000 、 100000 以及 1000000 条记录。
select * from rebuild_test where id = 10; select * from rebuild_test where id between 100 and 199; select * from rebuild_test where id between 1000 and 1999; select * from rebuild_test where id between 10000 and 19999; select /*+ index(rebuild_test) */ * from rebuild_test where id between 50000 and 99999; select /*+ index(rebuild_test) */ * from rebuild_test where id between 100000 and 199999; select /*+ index(rebuild_test) */ * from rebuild_test where id between 1 and 1000000; select /*+ index_ffs(rebuild_test) */ id from rebuild_test where id between 1 and 1000000;
在运行这些测试语句前,先创建一个 pctfree 为 50% 的索引,来模拟索引碎片,分析并记录索引信息。
SQL> create index idx_rebuild_test on rebuild_test(id) pctfree 50; SQL> exec dbms_stats.gather_table_stats(user,'rebuild_test',cascade=>true);
然后运行测试语句,记录每条查询语句所需的时间;接下来以 pctfree 为 10% 重建索引,来模拟修复索引碎片,分析并记录索引信息。
SQL> alter index idx_rebuild_test rebuild pctfree 10; SQL> exec dbms_stats.gather_table_stats(user,'rebuild_test',cascade=>true);
接着再次运行这些测试语句,记录每条查询语句所需的时间。下表显示了两个索引信息的对比情况。
pctfree |
Height |
blocks |
br_blks |
lf_blks |
pct_used |
clustering_factor |
50% |
3 |
4224 |
8 |
4096 |
49% |
2326 |
10% |
3 |
2304 |
5 |
2226 |
90% |
2326 |
下表显示了不同的索引下,运行测试语句所需的时间对比情况。
记录数 |
占记录总数的百分比 |
pctused(50%) |
pctused(90 % ) |
性能提高百分比 |
1 条记录 |
0.0001% |
0.01 |
0.01 |
0.00% |
100 条记录 |
0.0100% |
0.01 |
0.01 |
0.00% |
1000 条记录 |
0.1000% |
0.01 |
0.01 |
0.00% |
10000 条记录 |
1.0000% |
0.02 |
0.02 |
0.00% |
50000 条记录 |
5.0000% |
0.06 |
0.06 |
0.00% |
100000 条记录 |
10.0000% |
1.01 |
1.00 |
0.99% |
1000000 条记录 |
100.0000% |
13.05 |
11.01 |
15.63% |
1000000 条记录 (FFS) |
100.0000% |
7.05 |
7.02 |
0.43% |
上面是对最好的 clustering_factor 所做的测试,那么对于最差的 clustering_factor 会怎么样呢?我们将 rebuild_test 中的 id 值反过来排列,也就是说,比如对于 id 为 3478 的记录,将 id 改为 8743 。这样的话,就将把原来按顺序排列的 id 值彻底打乱,从而使得 id 上的索引的 clustering_factor 变成最差的。为此,我写了一个函数用来反转 id 的值。
create or replace function get_reverse_value(id in number) return varchar2 is ls_id varchar2(10); ls_last_item varchar2(10); ls_curr_item varchar2(10); ls_zero varchar2(10); li_len integer; lb_stop boolean; begin ls_id := to_char(id); li_len := length(ls_id); ls_last_item := ''; ls_zero := ''; lb_stop := false; while li_len>0 loop ls_curr_item := substr(ls_id,li_len,1); if ls_curr_item = '0' and lb_stop = false then ls_zero := ls_zero || ls_curr_item; else lb_stop := true; ls_last_item:=ls_last_item||ls_curr_item; end if; ls_id := substr(ls_id,1,li_len-1); li_len := length(ls_id); end loop; return(ls_last_item||ls_zero); end get_reverse_value;
接下来,我们创建我们第二个测试的测试表。并按照与第一个测试案例相同的方式进行测试。注意,对于测试查询来说,要把表名(包括提示里的)改为 rebuild_test_cf 。
SQL> create table rebuild_test_cf as select * from rebuild_test;
SQL> update rebuild_test_cf set name=get_reverse_value(id);
发表评论
-
(转)Andriod是什么
2010-12-02 11:24 1612导读:Sans Serif是Google的 ... -
(转)SQLite入门与分析(六)---再谈SQLite的锁
2010-11-19 00:09 941写在前 面:SQLite封锁机制的实现需要底层文件系统的 ... -
(转)SQLite入门与分析(五)---Page Cache之并发控制
2010-11-19 00:05 1045写在前面:本节主要谈 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(3)
2010-11-19 00:01 950Code 写在前面:由于 内容较多,所以断续没有写完的 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(2)
2010-11-18 23:57 1140写在前面:个人认为pager层是SQLite实现最为核心的 ... -
(转)SQLite入门与分析(四)---Page Cache之事务处理(1)
2010-11-18 23:53 938写在前面:从本章开始,将对SQLite的每个模块进行讨论。 ... -
(转)SQLite入门与分析(三)---内核概述(2)
2010-11-18 23:48 1300写在前面:本节 是前 ... -
(转)SQLite入门与分析(三)---内核概述(1)
2010-11-18 23:41 795写在前面:从本 章开始, ... -
(转)SQLite入门与分析(二)---设计与概念(续)
2010-11-18 23:38 1039写在前面:本节 讨论事务,事务是DBMS最核心的技术之一 ... -
(转)SQLite入门与分析(二)---设计与概念
2010-11-18 23:35 789写在前面:谢谢各位的 ... -
(转)SQLite入门与分析(一)
2010-11-18 23:31 904写在前面:出于项目的 需要,最近打算对SQLite的内核 ... -
(转)深入研究B树索引(五)
2010-11-18 15:07 11905. 重建 B ... -
(转)深入研究B树索引(四)续
2010-11-18 14:58 9114.2 B 树索引的对于删除( DEL ... -
(转)深入研究B树索引(三、四)
2010-11-18 14:44 7113. B 树索 ... -
(转)深入研究B树索引(二)
2010-11-18 14:20 7562. B 树索引的内部结构 ... -
(转)深入研究B树索引(一)
2010-11-18 14:12 1000摘要: 本文对B 树索引的结构、内部管理等方面做了一个全面 ... -
(转)B树、B-树、B+树、B*树都是什么
2010-11-17 23:46 671B 树 即二叉搜 ... -
画UML图时注意的几个原则(转)
2010-08-03 12:34 1622软件开发中,分析和设计时,文档的编写和思想的交流,经常要绘制各 ... -
你是个软件架构师吗?(转)
2010-07-14 11:11 661开发和架构的界限难以 ... -
(转)同曲异奏——高效能项目团队的五大特点
2010-03-29 00:24 856同曲异奏——高效能项 ...
相关推荐
**深入研究B树索引** B树(B-tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,特别是在实现索引存储时。它能够保持数据有序,允许快速查找、插入和删除操作。本篇文章将深入探讨B树的核心概念、...
B树索引是一种高效的数据检索方法,广泛应用于数据库系统中,特别是关系型数据库管理系统。B树索引的主要目的是加速数据的查找、排序和更新操作,通过构建一种平衡的多路搜索树结构,使得数据访问更加高效。 B树...
B+树索引 B+树索引 B+树索引 B+树索引 B+树索引 B+树索引
**B树索引算法** B树(B-tree)是一种自平衡的树数据结构,它能够保持数据排序,常用于数据库和文件系统中。B树的主要特点是每个节点可以有多个子节点,这使得它在处理大量数据时能有效地进行查找、插入和删除操作...
通过对B树索引简单实验的学习,我们不仅了解了B树索引的基本概念和创建方法,还深入了解了其查询过程和执行计划。这些知识对于数据库开发人员来说是非常重要的,能够帮助他们更好地理解和优化数据库查询性能。
Oracle 索引研究
B+树是一种广泛应用于数据库索引的平衡树数据结构,它通过维护数据的有序性,提高了数据检索的效率。在数据库系统中,B+树索引是实现快速查找、更新和删除操作的基础。本文将详细介绍B+树索引的原理及其在实际应用中...
当数据庞杂时,B 树索引在查找效率和空间利用率方面还存在不足。针对该问题提出一种改进的B 树结构,首先通过调整叶子节点与非叶子节点的数量关系,以降低树的深度;然后优化原插入算法,在分裂节点前进行平衡处理...
B 和 B+树是数据库和文件系统中常用的索引数据结构,它们都是从平衡树理论中派生出来的,主要用于高效地存储和检索大量数据。两者的主要区别在于数据的分布和查询方式。 1. B 树(Balanced Tree): - B 树是一种...
**数据库中的B+树索引原理** B+树(B Plus Tree)是一种高效的数据结构,广泛应用于数据库系统中,主要用于实现快速的索引查询。它优化了传统的二叉搜索树,能够有效地处理大规模数据,尤其是在磁盘存储环境中,极...
在本项目中,"B树索引实现歌曲管理系统qt界面"是一个使用了数据结构和图形用户界面技术的软件工程实践。下面将详细解释这个系统的关键组成部分及其相关知识点。 首先,我们要理解**B树(B-Tree)**。B树是一种自...
下面我们将深入探讨B+树的基本概念、特性以及它如何提高数据库查询效率。 **B+树的结构与特性:** 1. **节点类型**:B+树包含根节点、内部节点(也称分支节点)和叶子节点。所有数据都存储在叶子节点上,非叶子节点...
在这个项目“B树实现的文件索引 java版”中,我们探讨的是如何利用Java语言来实现B树在文件索引中的应用。 B树是一种多路搜索树,它的每个节点可以有多个子节点,通常比二叉树更适合处理大量的数据。这种数据结构的...
为什么说B+树比B树更适合做文件索引
总之,这个压缩文件提供了一个深入了解和实践B-树索引的好机会,通过学习和分析Java代码,不仅可以掌握B-树的基本原理,还能提高编程技能,对数据库和文件系统的设计有更深入的理解。对于计算机科学的学生、软件...
索引通过创建一种数据结构(例如B树)来实现这一点,这种结构允许数据库管理系统能够快速定位到数据所在的物理位置。 #### 二、B+树结构 B+树是一种自平衡的树数据结构,常用于数据库索引。B+树的特点在于所有的...
在数据库管理系统中,索引是一种优化查询性能的重要技术。这里我们主要探讨两种索引结构:B树(B-Tree)和一种自创的Connect结构。...通过源码分享,我们可以深入研究这些数据结构的实现,进一步提升自己的技术能力。
在给定的"book-mis.rar_B+树索引_b树系统"中,我们可以看到一个专门针对图书管理的系统,它利用了B+树(B Plus Tree)索引来优化数据操作,如查找、排序、添加和删除。这里我们将详细探讨B+树索引及其在图书管理系统...