文档章节

DB2优化之:索引(index)

Goopand
 Goopand
发布于 2015/04/20 17:48
字数 1637
阅读 28
收藏 0
点赞 0
评论 0

索引


1.1索引与目录

每一本书的前几页一般都是目录,而最后几页通常会有一个关键字索引。对于数据库来讲系统表(如:sysobjects等)就是目录,而标字段上的索引就如同书本后面的关键字索引。

数据库中,目录(数据字典)和索引的区别:目录纵向、索引横向。



1.2影响索引作用的因素

1.2.1区分度(检索比率)

优化器根据统计信息来生成执行计划,如果数据库没有收集索引的统计信息,优化器就无从下手,只能按部就班,通过全表扫描来执行查询。所以,新创建的索引需要重新运行统计,否则索引无效。

举一个例子,有个表TABLE1,其中有一个字段COL1取值是“1”、“2”、“3”三种,运行统计的结果是告诉数据库TABLE1中的数据其中字段COL1的各种取值所占的比重。示意如下:

“1” - 12%;

“2” - 66%;

“3” - 22%。

假设还有个字段COL2取值和数据所占的百分比如下:

“A” - 50%;

“B” - 50%。

则查询语句1:

select * from TABLE1 where COL1 = “1”and COL2 = “A”,

数据库优化器会优先选择字段COL1上的索引来定位表中的数据,因为通过COL1上的索引就可以将结果集迅速定位在一个小范围内12%。而相反的,对于查询语句2:

select * from TABLE1 where COL1 = “2”and COL2 = “A”,

数据库会优先选择COL2上的索引,因为对于语句2的查询条件COL2上的索引具有更好的区分度。

从上面可以看出,数据库的优化器通常会优先选择区分度较高的索引(针对于查询条件,条件不同选择的索引可能不同)。

数据库里的数据是变化的,所以某个时候采集的统计信息,过一段时间后可能会过时,甚至误导数据库优化器,这样同样会造成运行性能的低下。所以除了,最初建立索引时需要运行统计,在表中的数据发生变化时也需要运行统计。经验:当表中数据量变化达到10%时,需要重新运行统计。

1.2.2聚集度


范围扫描

1.2.3表大小

小型表

中大型表

超大型表

1.2.4业务类型

OLTP和OLAP

1.2.5函数与索引

函数,like语句。。。

Substring(col_name,1, 3)vs. Substring(col_name, 3, 3)

like ‘QQQ% vs. like ‘%QQQ’



1.3索引开销

性能利器

双刃剑


索引对插入操作的影响(Oracle)


索引对插入操作的影响(MySQL)


比较索引与促发器对性能的影响



1.4索引总结

使用索引实现关键数据的高效访问。但是需要知道每个索引都会给数据库更新带来额外的开销。这就意味着,低效的索引会给数据库带来灾难。

对于数据库,我们必须关注关键数据的读取,为他们提供最高效的访问路径。对此,基本策略就是建立索引。在索引提供高效访问的同时,也带来了额外的系统开销。开销分为磁盘空间的开销和处理器开销。下面我们讨论一下处理器开销。每当在表中插入或删除记录时,该表的所有索引必须进行相应调整。每当对已建立索引的字段进行更新时,这种调整也会发生。举例子说,如果在未建立索引的表中插入数据需要100个单位时间,那么每增加一个索引就会增加100到250个单位时间。有趣的是,维护索引的开销与简单触发器带来的开销大致相当。

在建立索引前线介绍一些最通俗的信息,这些信息来自developWorks,列出这些信息是因为我觉得这些信息通常情况下是值得参考的:

1.         当要在一个合理的时间内结束查询时,应避免添加索引,因为索引会降慢更新操作的速度并消耗额外的空间。有时候还可能存在覆盖好几个查询的大型索引。

2.         基数较大的列很适合用来做索引。

3.         考虑到管理上的开销,应避免在索引中使用多于5个的列。

4.         对于多列索引,将查询中引用最多的列放在定义的前面。

5.         避免添加与已有的索引相似的索引。因为这样会给优化器带来更多的工作,并且会降慢更新操作的速度。相反,我们应该修改已有的索引,使其包含附加的列。例如,假设在一个表的 (c1,c2)上有一个索引i1。您注意到查询中使用了"wherec2=?",于是又创建一个(c2)上的索引i2。但是这个相似的索引没有添加任何东西,它只是i1的冗余,而现在反而成了额外的开销。

6.         如果表是只读的,并且包含很多的行,那么可以尝试定义一个索引,通过CREATE INDEX中的INCLUDE子句使该索引包含查询中引用的所有列(被INCLUDE子句包含的列并不是索引的一部分,而只是作为索引页的一部分来存储,以避免附加的数据FETCHES)。

对于数据仓库(查询系统数据库)可以建立较多的索引(索引和数据的比例可以是1:1)。

决定是否使用索引,可以重点考虑检索比率。即,判断索引有效性的依据,就使用键值作唯一性条件检索出的数据的百分比。百分比越低,索引越有效。做出这个论断的前提是一些假设,如磁盘访问的相关性能。

索引键值相关记录的物理位置是否相邻也很重要,因为是通过块来操作数据的。建立了索引之后,如果索引键所指向的记录散布于整个表中,即使这些记录在表中占的比率很小,但因为它们分散在整个磁盘上,所以索引的性能就会大打折扣。

另外值得注意的是,函数和类型转换可能导致索引失效。



本文转载自:http://blog.csdn.net/zhaojianmi1/article/details/6601524

共有 人打赏支持
Goopand
粉丝 8
博文 376
码字总数 186123
作品 0
朝阳
DB2日常维护——REORG TABLE命令优化数据库性能

【转】DB2日常维护——REORG TABLE命令优化数据库性能 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常、安全、高效运行,防止一些错...

钟小华
2013/03/05
0
0
对 pureXML 应用程序应用 DB2 优化准则

简介: 优化准则(Optimization guideline)是非常强大的工具,使您能够影响关键的执行计划决策,包括表访问方法、索引选择、连接方法和连接顺序。在 IBM® DB2® Version 9.7 for Linux®,...

红薯
2010/03/19
291
0
使用 DB2 语句集中器特性和 DB2 语句重新优化特性改进 SQL 执行时间

简介 Database API(比如 JDBC 和 ODBC/CLI)允许数据库开发人员选择使用带有或不带参数标记(也称为主机变量)的 SQL 语句。通常,人们在进行选择时很少考虑其影响。当数据库应用程序稍后执...

老枪
2011/07/12
339
0
闲谈索引、谓词和DB2运行架构

12月1日,IBM数据库解决方案架构师马远老师,在DBA+社群DB2用户群进行了一次主题为“闲谈索引、谓词和DB2运行架构”的线上分享。小编特别整理出其中精华内容,供大家学习交流。同时,也非常感...

马远
2015/12/03
0
0
IBM原厂资深专家:DB2优化器和成本模型分析

src="https://mmbiz.qlogo.cn/mmbiz/tibrg3AoIJTtkVh8u4bRkfIvjE5vpWNPjaS8nibudC4PvBdVmjtu5iaIXwzMl0gic2CuBKn5NicfHZuwzFvUSia59YDw/0?wxfmt=jpeg" data-ratio="0.5889328063241107" data......

刘俊
2015/11/19
0
0
Oracle原厂老兵:从负面案例看Hint的最佳使用方式

作者介绍 罗敏,从事Oracle技术研究、开发和服务工作20余年,在Oracle中国公司的10多年,分别在顾问咨询部、技术服务部担任资深技术顾问。曾参与国内银行、电信、政府等多个行业大型IT系统的...

罗敏
2016/10/12
0
0
经验分享之数据库优化

在软件开发中,数据库的优化也是非常重要的一部分,坚实的后台会使你的系统更加完美! ◆对mysql优化是一个综合性的技术,主要包括: a、表的设计合理化【符合三范式(3NF)】 b、添加适当索...

u013043341
2017/08/06
0
0
DB2 最佳实践: 编写并调优查询语句以优化性能最佳实践

内容提要 通过 “IBM DB2 for Linux, UNIX, and Windows 最佳实践”专题,获得最常用的 DB2 9 产品配置实践指南,并使用这些知识提高 DB2 数据服务器的价值。 这些最佳实践文章给出了最优化方...

钟小华
2013/03/05
0
0
DB2联邦重点

DB2联邦重点 1.用户信息存储在syscat.useroptions中。通过create user mapping建立本地用户和远地用户的对应。 2.pass-through session: 直接把请求通过wrapper传给远程数据库。这样的话就可...

雁南飞丶
2016/01/21
71
0
DB2常用命令

1. 启动实例(db2inst1): db2start 2. 停止实例(db2inst1): db2stop 3. 列出所有实例(db2inst1) db2ilist 3-1.列出当前实例: db2 get instance 3-2.列出所有数据库: db2 list database direc......

xujh1986
2016/02/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
20分钟前
1
0
1.13 单用户模式

命令 init 6 #重启,reboot或shutdown -r now init 0 #重启,poweroff 单用户模式:密码忘记情况下 主机重启,按方向键↑,选择CentOS Linux (3.10.0-514.e17.X86 64) 7 (Core),按e键编辑...

小丑鱼00
22分钟前
1
0
jstack的简单使用

公司测试反应, 一个java应用的机器,cpu始终是30%, 即使不做交易, 于是想到了之前看到的jstack文章, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid...

零二一七
27分钟前
1
0
崛起于Springboot2.X之项目war打包部署(18)

将springboot项目打包步骤: 1、启动类 extends SpringBootServletInitializer 2、启动类添加覆盖方法 @Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder......

木九天
36分钟前
2
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
42分钟前
1
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
44分钟前
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
46分钟前
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
47分钟前
1
0
centos7 卸载mysql

[root@zyf ~]# rpm -qa|grep -i mysqlmysql-community-libs-5.6.34-2.el7.x86_64mysql-community-server-5.6.34-2.el7.x86_64mysql-community-release-el7-5.noarchmysql-community-......

Yao--靠自己
56分钟前
0
0
【Spring 系列 条件注解】

Spring 提供了按条件注册Bean的功能涉及到两个组件分别是:核心接口Condition,核心注解Conditional。 1、示例说明 为了演示条件注解的效果,需要定义一个属性文件,然后根据属性文件中配置的...

HansonReal
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部