DB2 V9.7 for Linux, UNIX, and Windows

调整排序性能

由于查询通常需要经过排序或分组的结果,因此正确地配置排序堆对于良好的查询性能而言至关重要。

在下列情况下,需要进行排序:

影响排序的元素

下列因素将影响排序性能:
  • 下列配置参数的设置:
    • 排序堆大小(sortheap),此参数指定用于执行每次排序的内存量
    • 排序堆阈值(sheapthres)和共享排序的排序堆阈值(sheapthres_shr),这些参数控制整个实例中可用于执行排序的内存总量
  • 工作负载中需要执行大量排序操作的语句数
  • 是否存在有助于避免执行不必要的排序操作的索引
  • 使用了未最大程度减少排序需求的应用程序逻辑
  • 并行排序,这可以提高排序性能,但仅当语句使用分区内并行性时才可行
  • 排序是否溢出。如果经过排序的数据在排序堆(这是每次执行排序时分配的内存块)中放不下,那么数据将溢出到数据库所拥有的临时表中。
  • 排序结果是否管道式结果。如果经过排序的数据可直接返回,而不需要一个临时表来存储经过排序的列表,那么这是管道式排序。

    对于管道式排序,在应用程序关闭与排序相关联的游标之前,排序堆不会被释放。在游标关闭之前,管道式排序可以持续耗用内存。

尽管可以完全在排序内存中执行排序,但这可能会导致过度进行页交换。在这种情况下,将失去大型排序堆的优势。因此,每当您调整排序配置参数时,应该使用操作系统监视器来跟踪系统页面调度方面的任何变化。

用于管理排序性能的技术

确定排序对性能产生重大影响的特定应用程序和语句:
  1. 在应用程序级别和语句级别设置事件监视器,以帮助您确定排序总时间最长的应用程序。
  2. 对于其中的每个应用程序,查找排序总时间最长的语句。

    您也可以搜索说明表,以确定执行了排序操作的查询。

  3. 使用这些语句作为设计顾问程序的输入,该程序将标识索引并可创建索引以减少排序需求。
可以使用自调整内存管理器(STMM)自动根据需要动态地分配和取消分配排序所需的内存资源。要使用此功能:
  • 通过将 self_tuning_mem 配置参数设为 ON,对数据库启用自调整内存功能。
  • sortheapsheapthres_shr 配置参数设为 AUTOMATIC。
  • sheapthres 配置参数设为 0。
您还可以使用数据库系统监视器和基准程序测试技术来帮助设置 sortheapsheapthres_shrsheapthres 配置参数。对于每个数据库管理器以及每个数据库:
  1. 设置并运行一个典型的工作负载。
  2. 对于每个适用的数据库,收集下列性能变量在基准程序工作负载周期内的平均值:
    • 使用中排序堆总大小(sort_heap_allocated 监视器元素的值)
    • 活动排序次数和活动散列连接数(active_sortsactive_hash_joins 监视器元素的值)
  3. sortheap 设为每个数据库的平均使用中排序堆总大小
    注: 如果将长键用于排序,那么可能需要增大 sortheap 配置参数的值。
  4. 设置 sheapthres。要估算适当的大小:
    1. 确定实例中哪个数据库的 sortheap 值最大。
    2. 确定此数据库的排序堆的平均大小。

      如果太难以确定,那么使用最大排序堆大小的 80%。

    3. sheapthres 设置为平均活动排序次数乘以上面计算的平均排序堆大小。这是建议的初始设置。以后,您可以使用基准测试技术来优化此值。

IBM® InfoSphere® Optim™ Query Workload Tuner 提供的工具可提高单个 SQL 语句和 SQL 语句组(它们称为查询工作负载)的性能。有关此产品的更多信息,请参阅产品概述页。在 V3.1.1 或更高版本中,还可以使用工作负载设计顾问程序来执行在“DB2® 设计顾问程序”向导中可用的许多操作。有关更多信息,请参阅工作负载设计顾问程序的文档,网址为:http://pic.dhe.ibm.com/infocenter/dstudio/v4r1/topic/com.ibm.datatools.qrytune.workloadtunedb2luw.doc/topics/genrecsdsgn.html