Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181271
  • 博文数量: 36
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-26 10:26
文章分类

全部博文(36)

文章存档

2010年(3)

2009年(18)

2008年(15)

我的朋友

分类:

2010-05-12 09:33:13

声明:转自飞天的博客,呵呵,非原创,可以帮助理解不同版本下排序参数的区别
 

在DB2实践中,我们经常发现很多用户对排序的几个参数使用不当,造成性能的严重下降。本文详细介绍这几个参数的使用原理,并介绍在新版本中v9.1的一些变化,希望对大家有所帮助。

1) DB2 v8

当需要对数据行进行顺序读取(order)时,比如order by\group by\distinct等,如果没有索引满足要求,或者优化器认为索引的代价更高时,就需要扫描数据表并进行排序。DB2里,存在两种类型的排序:私有排序(private sort)和共享排序(shared sort)。我们知道,DB2的内存模型包括:实例级共享内存、数据库级共享内存、应用共享内存和代理内存。其中,私有排序就发生在代理内存(agent private memory);而共享排序发生在数据库共享内存。

对于私有排序,实例配置参数sheapthres指定了某个给定时间可为所有私有排序分配的软内存限制(soft limit)。当为私有排序分配的内存达到了此限制,新请求的私有排序的内存大小分配将会减少。同时,在db2diag.log日志里会给出提示:

"Not enough memory available for a (private) sort heap of size size of sortheap. Trying smaller size..."

当出现此类错误的时候,需要检查是否分配了太大的sortheap,sortheap指定了为每个私有排序分配的最大内存,这是个数据库配置参数,缺省值是256个4k页,即1M大小。对于大部分OLTP应用来说,缺省值就可满足要求。如果设的太大,会很容易超出sheapthres限制。对于OLAP应用,往往需要处理大量数据,对排序的要求也会增加,可适当增加sortheap和sheapthres的值。

当设置了intra-partition分区内并行或者connection contentrator(连接集中器,当MAX_CONNECTIONS>MAX_COORDAGENTS时)时,DB2可能选择会共享排序。如果执行共享排序,那么排序发生在数据库共享内存,可供分配的共享排序大小由sheapthres_shr数据库参数来控制,这个值是硬限制(hard limit)。当达到此限制后,请求排序的新的应用会收到SQL0955(reason code 2)错误,只有当消耗的共享排序值低于此限制后才允许新应用请求共享排序。对于共享排序,当数据库激活或第一次连接时就会分配sheapthres_shr参数指定的数据库共享内存。

当发现排序次数太多或者有排序溢出的时候,需要检查是否在表上建立了合适的索引。通常大的表扫描会导致的大量的排序,严重影响性能。

intra-partition parallelism:指的是在一个单分区数据库中把一个操作分成多个部分,然后同时执行。比较典型的有index creation,complex sql query,load等,通过enable intra-partition,可以充分利用SMP的多处理器的处理能力。

2)DB2 v9.1的变化

在DB2 v9.1中,sheapthres_shr参数是一个软限制。需要时,排序内存堆可使用其他未使用的数据库共享内存。当实例级参数sheapthres设置为0时,仅适用数据库共享内存进行共享排序,排序内存分配受sheapthres_shr配置参数值的约束。

而且,仅当数据库管理器配置参数 sheapthres 设置为 0 时,才允许自动调整 sheapthres_shr和sortheap。在DB2 V8 中,无论如何设置 sheapthres 参数值,只有 SMP 环境中(intra_partition=yes)的排序或运行可由多个代理程序访问的集中器的排序才会消耗共享内存。在 DB2 V9.1 中,如果将sheapthres数据库管理器配置参数设置为 0,则所有排序都将使用共享内存。如果将 sheapthres 数据库管理器配置参数设置为大于 0 的值,则只有 SMP 环境中的排序或运行可由多个代理程序访问的集中器的排序将会消耗共享内存,其余进行私有排序。

3)使用建议

- 通过get snapshot for sorts on 进行监控锁的使用 (需先打开开关 update monitor switches using sort on)

- sheapthres的值依赖于sortheap的大小和应用的并发执行数,应用的并发执行数可以通过get snapshot for database来监控。考虑到单个应用需要多次排序,sheapthres可设为:sortheap*并发数*2

- 减少排序次数,建立合适的索引

- 需要对大表进行排序时,适当增大sortheap和sheapthres参数值

- 对于v9.1,建议用缺省值。(dbm cfg: sheapthres=0 ; db cfg: sheapthres_shr=automatic, sortheap=automatic

阅读(1607) | 评论(0) | 转发(0) |
0

上一篇:总结一下tar和pax

下一篇:没有了

给主人留下些什么吧!~~