- 浏览: 105614 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (75)
- JVM (22)
- 数据结构 (11)
- java 基础 (16)
- gc (6)
- jmock (1)
- Google (2)
- MapReduce (1)
- Memory (2)
- 算法 (2)
- cglib (1)
- jdk (3)
- 虚拟机 (3)
- 安全 (2)
- 多线程 (1)
- 工作 (1)
- 生活 (1)
- MongoDB (2)
- Hadoop (4)
- HDFS (2)
- cms (2)
- Spring (1)
- 网络协议 (1)
- GitHub (1)
- MYSQL 调优和使用必读(转) (1)
- 分布式 (2)
- Big Data (0)
- 技术Blog (1)
- Hbase (2)
- Zookeeper (1)
- paper (0)
最新评论
-
lzc_java:
Java线程安全兼谈DCL -
select*from爱:
it's nice
IT业薪水大揭秘
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 。
发表评论
-
哈希表
2013-05-03 11:03 1583转载自 ---- http://blog.java ... -
Java 链表
2013-01-18 15:27 931转载自 ---- http://359094247.iteye ... -
哈夫曼与压缩
2013-01-18 15:24 865转载自 ---- http://359094247.iteye ... -
排序算法java版(转载)
2011-08-10 14:06 849转载自 ---- http://yiyickf.iteye.c ... -
(转)B树、B-树、B+树、B*树都是什么
2011-08-03 16:55 660B 树 即二叉搜 ... -
(转)深入研究B树索引(五)
2011-08-03 16:53 8565. 重建 ... -
(转)深入研究B树索引(四)续
2011-08-03 16:52 7704.2 B 树索引的 ... -
(转)深入研究B树索引(三、四)
2011-08-03 16:51 7473. B 树索引的访问 ... -
(转)深入研究B树索引(二)
2011-08-03 16:51 8942. B 树索引的 ... -
(转)深入研究B树索引(一)
2011-08-03 16:50 1028摘要: 本文对B 树索引的结构、内部管理等方面做了一个 ...
相关推荐
java练习题
云南省移动应用大赛模板.zip
前台技术框架采用Bootstrap,一个高度灵活的HTML5响应式框架,为用户提供了流畅的前端交互体验。程序开发环境支持多样化,无论是myEclipse、Eclipse还是Idea都能轻松应对,结合mysql数据库,确保了数据的高效处理与存储。后台架构则选用SSM组合——SpringMVC、Spring和Mybatis,这一组合以其稳定性和高效性而备受青睐。 校园公益信息关联系统采用b/s架构,实现用户信息、活动类型、公益活动、活动报名、捐款、捐款统计、留言和新闻信息的全面管理。系统分为前台学生端和后台管理员端,满足不同用户群体的需求。 管理员端功能丰富,包括学院管理、活动类型管理、公益活动管理、活动报名管理、捐款信息管理、管理员账号管理、密码修改、捐款统计管理、留言管理和新闻信息管理等。管理员能够灵活添加、修改、删除和查询各类信息,确保信息的准确性和时效性。同时,捐款统计功能以直观的统计图形式展现,为管理员提供决策支持。 学生端则专注于学生的日常需求,包括添加捐款信息、留言、报名活动以及密码修改等。学生可以轻松完成捐款操作,发表留言,查看并报名公益活动,随时修改个人密码,确保账
JavaWeb程序设计SSM框架选课系统开发大作业有数据库文
行业分析报告
1、嵌入式物联网ESP32项目实战开发。例程经过精心编写,简单好用。 2、代码使用Visual Studio Code + ESP-IDF开发,C语言编程。例程在ESP32-S3上运行。若在其他型号上运行,请自行调整。 3、如果接入其他传感器,请查看发布的其他资料。 4、ESP32与模块的接线,在代码当中均有定义,请自行对照。 5、若硬件差异,请根据自身情况适当调整代码,程序仅供参考。 6、代码有注释说明,请耐心阅读。 7、技术v:349014857;
USB无线网卡驱动 USB\VID_1A86&PID_E397&REV_0738
TA-Lib(Technical Analysis Library, 即技术分析库)是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等。但很多人安装指标计算ta-lib库就总报错,就可以在这里找到包下载后安装。 文件举例:TA_Lib‑0.4.24‑cp37‑cp37m‑win_amd64.whl 命名解释:包名-版本号-cp37代表适用于python3.7版本-win代表windows平台-amd64表示64位版本(与python版本要一致) 假定文件下载到d盘根目录,使用如下命令进行安装: pip install d:\TA_Lib‑0.4.24‑cp37‑cp37m‑win_amd64.whl
电子通信设计资料电动智能小车设计论文资料提取方式是百度网盘分享地址
调节篮球比赛定时器,毕业设计实验报告,multisim仿真,AD09原理图及PCB图
编程题实训-串
汉诺塔c语言递归
行业分析报告
电子通信设计资料单片机串行通信发射机论文资料提取方式是百度网盘分享地址
完整代码!扫雷游戏,vs2010使用vs2010开发小游戏,这是一个扫雷的游戏,适应于大作业和毕业论文.zip
基于JAVA毕业设计-JAVA图书馆书库管理系统设计(论文+源代码).rar 毕业设计(论文)是考核应考者综合运用所学基础理论和专业技能,独立分析和解决实际问题的能力。计算机应用专业培养从事计算机软件和硬件设计,开发和应用的高层次人才,检测考生是否阅读了必要的中外文献,能否运用科技合理的定性和定量分析,来设计和实现设计系统。 图书馆书库管理系统主要是完成图书管理员对图书的管理(增加新书,删除旧书,并修改等的图书编辑);图书管理员对读者借还书的统计(图书的在库数目和还日期的统计)和管理;读者和管理员对图书信息和读者信息的查询;当查到所需信息时,打印出相应的信息报表等工作。 在图书馆书库管理系统的设计与实现过程中,我深深体会到此次毕业设计的重要性------它是我走上工作岗位前的一次重要的练习,更深刻体会到理论联系实践的重要性和必要性。同时,我也感受到JAVA 和SQL SERVER 2000 的功能之强大,事件处理的灵活性和高效性。但我掌握和应用的还不是很熟练,应多加实践和练习,在以后的工作中,我将不断的学习和充实自己,力争成为一个高水平的程序员。
行业分析报告
mybatis-plus-extension.jar 各个版本,免费下载。 mybatis-plus 的扩展插件。,各个版本,免费下载。 mybatis 增强工具包的扩展插件,各个版本,免费下载。 下载不了,可关注我,评论区联系我。
halcon缺陷检测
1000+套最新计算机专业毕业设计源码+论文+PPT.txt.zip