DB2索引问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前段时间作项目,被数据库的查询效率所困扰,使用的数据库是DB2 8.2 。具体是这样:

表A(a_id, a_title, a_addr, .....)   该表大概50多个字段,200多万条记录,2G大小左右
表B(lib_id, b_id) 记录了b_id所对应的a_id记录集合,每个lib_id大概对应5万左右的A表记录,目前lib_id9个,总共记录数50万左右,以后可能会增长到50个lib_id,记录数达到250万

业务中经常要做表A和B的连接查询,比如下面的语句:( b.lib_id=361对应的记录大概4万条)

(1)  select count(*) from A, B where A.a_id = B.b_id and b.lib_id=361
(2)  select count(*) from A, B where A.a_id = B.b_id and A.a_addr = '中国' and  b.lib_id=361
(3)  select count(*) from A, B where A.a_id = B.b_id and A.a_addr like  '%宁波%' and  b.lib_id=361
(4)  select count(*) from A, B where A.a_id = B.b_id and A.a_addr like  '宁波%' and  b.lib_id=361

分别给A,建立了三个索引a_id, a_title, a_addr,给表B建立了复合索引(b_id, a_id),结果:

(1) 速度很快 <1s
(2), (3), (4)  速度很慢,超过90s

百思不得其解,就给机器增加了一个硬盘,将表A所在的表空间平均分布到到两个硬盘上,希望能够并行处理。
不过效果不佳,也许是加的硬盘太老的原因(几年前的老硬盘)。如果两个都是SCSI硬盘,应该能够提高些性能。
根据DB2的索引设计程序,建议使用MDC表。同学建议我使用分区表(DB2 9.0 和ORCAL都有)。

不过,昨天这个问题基本解决了,没有使用MDC表,也没有使用分区表。也证明了不是服务器的性能问题。
其实解决办法很简单:就是给表A建立几个复合索引,分别是(a_title, a_id), (a_addr, a_id)。然后进行测试

测试命令:db2batch -d dbname -a username/password -f sqlfilename

(1) select count(*) from A, B where A.a_id = B.b_id                                                       结果集40万  1.14s
(2) select count(*) from A, B where A.a_id = B.b_id  and b.lib_id=361                      结果集4万    0.72s
(3) select count(*) from A, B where A.a_id = B.b_id and a.addr like  '宁波%' and  b.lib_id=361 结果集2万 7.63s
(4) select count(*) from A, B where A.a_id = B.b_id and a.addr like  '%宁波%' and b.lib_id=361   结果集2万 1.6s
(5) select count(*) from A, B where A.a_id = B.b_id and a.addr like  '宁波%'            结果集24.8万 7.7s
(6) select count(*) from A, B where A.a_id = B.b_id and a.addr like  '%宁波%'         结果集24.8万 1.86s

对比(3),(4) 和(5),(6) 两组数据,发现 like '%宁波%' 的速度比 like '宁波%'居然还要快出几倍!

经过研究,又给B表增加了一个索引 lib_id,结果(3)的执行时间减少到0.67s,(4)的时间1.55s. 但是又如何来解释语句(5)和(6)之间的巨大差异呢?而且DB2给出的执行计划中(5)的成本只是(6)的20%左右!

经过反复实验,发现可能的原因是 like '宁波%'的结果集过大,因为在其它的查询例如 like '浙江%' 结果集在4k左右,确实比 like '%浙江%'效率高很多。


联想到之前,当我们的表只有20多万条记录时,没有建索引也飞快,可以总结以下经验:

1. 大表的索引很重要,服务器的配置对百万级数据库的性能影响不大。
2. 对于连接查询,应该建立复合索引。
3. 当结果集很大时,like '% .. %' 的效率可能比 like '.. %'高很多。(待理论验证)

 

 

 

 

 

 

DB2存在多个索引时,“强制DB2使用您期望的索引 问题引入: 在执行SQL语句时,如果where条件后有多个谓词,对应多个索引,则SQL语句可能会用不同的索引,以下面的SQL为例: "select * from t1 where col1 = ? and col2 &lt;= ?" col1和col2上都有索引,那么有没有办法影响SQL语句的访问计划,使其倾向于只使用其中一个索引呢?答案是可以的,你可以告诉DB2,如果使用这个谓词对应的索引,... 阅读详情

相关推荐

SQL索引强制使用索引的实用

使用场景 实际开发中,往往会碰到多表联查,在前端的表现: 基于普通查询上面的高级查询,携带条件比较多 使用步骤 假设我的高级查询涉及7张表,查询条件携带也是涉及7张表,查询所遇到的问题就是,查询慢,索引定义于索引失效,那么该如何优化? 我的解决思路 1, 后端设置条件尽可能降低联表查询的次数,比如7张表,降低到4张,,根据查询条件进行筛选,设置默认表,可以提高效率,并且一般的导出也会使用到相关的功...

无名 601

强制数据库使用期望的某个索引

如果希望使用index1,则加上selectivity0.999,下面的例子中,在col2谓词后加了selectivity,并给了一个很大的数值0.999(接近1),DB2就会知道,如果使用idx2的话,会有99.9%的记录都满足条件,也就是该索引的效率不高。于是DB2选择了索引idx1。默认使用了EMPLOYEE_IDX2。

liys0811的博客 238

使用DB2优化概要强制修改DB2的执行计划

如何人为干预DB2的执行计划(access plan)

匿_名_用_户的专栏 2873

给DB数据表加强制索引

DB2 数据库会根据DB层的统计值决定 根据查询条件哪一个索引,某些情况下,由于未知原因,索引偏,故程序中可以规定程序哪一个索引来避免索引偏的情况发生。 强制索引的 实例代码如下: 1 SELECT vbeln 2 zorgdn 3 vstel 4 zstaff 5 zvtweg 6 v...

weixin_33975951的博客 318

oracle索引 db2索引,db2主键上的索引貌似失效了

客户反映系统上某个操作特别慢,要等很久于是我去客户现场看了下,那边的db2是安装在Linux下面的v8.1版本补丁好像不是很新,所以是没有db2top这个命令的,还好客户自己不知道从哪拷贝了db2top这个文件发现也可以直接使用,通过这个db2top的命令看到了一些具体的情况,当发生问题的时候,session中处于运行状态的一个agent会运行很长时间,再去查询这个agent的dynamic SQ...

weixin_36011231的博客 695

分享DB2 SQL查询性能问题一例

同事在测试服务器上遇到了一个严重的performance问题,请我帮忙(本人非专业DBA,只是相比同事多干了两年罢了)看看SQL调优和加index此SQL是一个较复杂的查询,inner join/left join了多个表,其中有几个表的数据量都在百万级以上。我拿到手并没多想,先看了SQL结构,没什么大问题。然后就跑了db2expln和d...

weixin_34252686的博客 342

db2 varchar最大长度_MySQL索引varchar长度问题(不能超过255)

Mysql varchar建索引遇到长度太长的问题: CREATE TABLE `t_crrs_record` (`ID` varchar(128) NOT NULL COMMENT '主键ID',`SYSTEM_CODE` varchar(32) DEFAULT NULL COMMENT '编码',`BUSINESS_ID` varchar(128) DEFAULT NULL COMM...

weixin_39914732的博客 947

db2数据库建表的时候主键怎么建_db2建表建立索引 DB2中为一个表添加索引怎么做?...

DB2中为一个表添加索引怎么做?1、首先,进行打开pycharm的界面当中,进行选中database选项。2、进行选中了database的选项,进行选中上 表 的选项。3、然后进行对表右键的操作,弹出了下拉菜单选中为 new 的选项。4、进行选中为new的选项,弹出了下一级菜单选中为 index 的选项。5、这样就会弹出了modify table的界面当中,进行点击 添加 的按钮。6、然后在nam...

weixin_39834984的博客 2076

idea使用dababase tools时导出db2建表语句,索引显示错误

idea导出db2的建表语句问题 问题:(本次只是简单记录一下问题,防止以后再次遇到) 1、使用idea创建db2索引是,不管下边这个Unique是否选择,等创建完成之后重新进来查看(或者用idea生成sql),都会显示为 勾选状态(也就是唯一索引) 2、使用idea的SQL Generate生成建表语句时,其普通索引会显示为“唯一索引” (具体原因尚未查明,可以我用的驱动版本过低导致) 解决...

巡山小妖008 2371

DB2优化-异常的DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.62.56

一台DB2数据库,近期交易总是锁表,报错如下: - DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.62.56 一般报 SQLCODE=-911的错误时,我们优先就会想到是不是索引问题,但这次从日志中看,报错时间点的数据库更新并不频繁,也没有对同一张表的同一行做UPDATE操作,而且报错的表字段少,且是用主键执行UPDATE,因此不可能是索引问题。 回看了报错...

星的依恋的博客 1万+

DB2 SQL 性能优化案例——索引对 SQL 性能的影响

DB2 SQL 性能优化案例一则 SQL 语句优化贯穿于数据库类应用程序的整个生命周期,包括前期程序开发,产品测试以及后期生产维护。针对于不同类型的 SQL 性能问题有不同的优化方法。索引对于改善数据库 SQL 查询操作性能至关重要,如何选择合适的列以及正确的组合所选择的列创建索引对查询语句的性能有着极大的影响,本文将结合具体案例进行解释。 问题描述 客户 A 业务核心数据库采用 DB2 U...

bfhai的博客 2477

DB2使用db2advis工具调优SQL

DB2使用db2advis工具调优SQL常见的三种用法部分参数的描述 转自 http://www.dataguru.cn/thread-227495-1-1.html 在之前的博文中说了如何去查看SQL的访问计划,当我们发现当前计划需要调整或者想看看有无优化空间时,我们可以使用db2advis工具,该工具是针对用户提供的工作负载(这里的工作负载就是一组SQL语句的组合)而给出的优化建议,优化建议包...

5162

DB2 数据库索引设计的最佳实践

序言 索引 (Index) 是关系型数据库中非常重要的一个概念,一般情况下,索引都会带来查询性能的提高。对于数据库管理员 (DBA) 来说 , 为数据库创建索引是他们工作中一个很重要的部分。通常来说,索引的设计是基于数据库中表的结构或者表的逻辑关系。比如说每个表的主键(Primary- key)其实都是一个索引,而记录雇员信息的 EMP 表中员工的编号 ID 列通常也会被建立索引。但是有经验

qzslzy的专栏 3455

DB2 11.5 锁等待和死锁问题处理

数据库中之所以会存在死锁或者锁等待,是因为某一事务执行时间过长,导致锁没有及时释放,那么我们的解决办法就是,事务过程尽量要短,并且事务中的sql执行要快,这样才不会有过多的锁等待。还有一个原因,就是一些执行糟糕的sql,比如了全表扫描,那么它会占据表中大量的锁,导致锁住了其他行,其他用户只能等待。 解决锁等待,要注意以下几点: 优化查询 Sql,采用db2advis建立合适的索引,使得其能够...

rede 3596

db2索引执行计划等

db2索引时,最好去掉双引号,否则大小写敏感

mandy1526的博客 362

Oracle/DB2 null key index

(Index key is null means all fields in an index are null.) In DB2 only one NULL key may exist in a unique index. When table and index are created as CREATE TABLE TAB ( A DECIMAL(6

程序员码工的专栏 1368

DB2 索引整理

分类: DB22012-09-21 18:22 40人阅读 评论(0) 收藏 举报 1、创建集群索引 CREATE INDEX INX_NAME ON TABLE_NAME (COL_NAME) CLUSTER 为了让语句更有效,可以通过ALTER TABLE语句相关的PCTFREE参数来使用集群索引,以便于可以将新数据插入到正确的页上,从而维护该群集的次序。通常情况下,表上的INSER

xqg_5083的专栏 1207

DB2 索引设计准则

 DB2 索引设计准则 1. 一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能,因为数据库有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。 2. 组合索引:组合索引即多列索引,指一个索引含有多个列。一

蓝猫的专栏 646

史上最全的 DB2 错误代码大全

史上最全的 DB2 错误代码大全

sajiahenmang的博客 1万+
上一篇: [转贴]DB2 分区特性
下一篇: 使用 Spring 更好地处理 Struts 动作
fan_7
博客等级 码龄26年 4粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值