Db2 如何分配线程
本信息高度概括了 Db2 分配线程的步骤。 它还描述了与这些步骤的性能有关的一些因素。
1. 创建线程
以下列表显示了创建线程的主要步骤。
- Db2 检查是否超过了活动线程的最大数量。 阈值由以下子系统参数指定:
- CTHREAD用于联合线程。 参见 “最大用户数”字段(CTHREAD子系统参数 )。
- 用于数据库访问线程的MAXDBAT。 参见 “最大远程主动”字段(MAXDBAT子系统参数 )。
如果超出适用限额,请求将等待处理。 线程等待时间无法追踪,但排队请求的数量会记录在性能追踪记录中,IFCID为73。
- Db2 检查 目录表(IFCID 15)中申请计划的授权ID。 SYSIBM.SYSPLANAUTH 如果检查失败,则检查 SYSUSERAUTH 表中是否有 SYSADM 特殊权限。
- 对于应用计划, Db2 加载与计划相关的控制结构。 应用计划的控制块分为若干部分。 标题和目录包含控制信息;SQL部分包含应用程序的SQL语句。 为执行计划的每个线程创建计划控制结构的副本。 创建线程时,仅加载标题和目录。
- Db2 加载处理计划所需的描述符。 一些控制结构描述了应用程序使用的 Db2 表空间、表和索引。
2. 资源分配
处理语句所需的部分结构以4 KB页面为单位进行存储。 如果这些结构尚未存在,则将其读入数据库缓冲池 BP0 ,并从那里复制到EDM池中。
为了加载处理SQL部分所需的控制结构, Db2 使用以下流程:
- 如果尚未在EDM池中, Db2 将加载与SQL语句相对应的控制结构部分。
- Db2 加载SQL语句中引用的、尚未存在于EDM池中的结构。
- 分配并打开数据集。 当控制结构加载时, Db2 会锁定所使用的资源。
3. SQL语句执行
如果语句位于包中,则在包中的语句首次执行时加载包的控制结构的目录和头。
该包的控制结构在语句执行时分配。 计划控制结构的标题在创建线程时分配。
分配包时, Db2 使用包授权缓存或SYSPACKAUTH目录表检查授权。 Db2 检查计划所有者是否拥有该计划的执行权限。 第一次执行时,信息不在缓存中,因此会使用目录。 第一次执行后,缓存将被使用。
对于动态绑定,授权检查也发生在语句执行时。
在声明(IFCID 58)结束时生成的简要记录包含每次扫描的信息。
从系统性能的角度来看,SQL语句执行性能最重要的因素是数据库缓冲池的大小。 如果缓冲池足够大,一些索引和数据页可以保留在那里,无需额外的I/O操作即可再次访问。
4. 承诺和线程终止
线程处于活动状态时,可能会多次发生提交处理。 例如,在线程控制结构下运行的应用程序可能会在执行期间多次发出明确的COMMIT或SYNCPOINT。 当应用程序或线程终止时,会发出隐式提交或同步点。
当 IMS 应用程序与 Db2 一起运行时,如果自上一个提交点以来 Db2 资源发生了变化,则开始两阶段提交过程。 在 CICS® 或RRSAF应用程序中,只有在 Db2 资源发生变化且 Db2 以外的资源在同一提交范围内发生变化时,才会开始两阶段提交过程。
提交和线程终止操作的性能痕迹中出现的重大事件按以下顺序发生:
- 在第一阶段(IFCID 84)中, Db2 将第一阶段结束记录写入日志(IFCIDs 0032和0033)。 痕迹显示有两个I/O操作,每个操作对应一个活动日志数据集(IFCID 0038和0039)。
- 在第二阶段(IFCID 70)中, Db2 将第二阶段记录的开头写入日志。 痕迹再次显示两次I/O操作。 页面和行锁(被锁定在提交点)被释放。 一个带有零请求令牌的解锁(IFCID 21)可在指定时间内解锁任何锁。 系统会生成一个锁记录摘要(IFCID 20),其中包含已锁定的最大页数和升级锁定的次数。 Db2 将第2阶段结束时的记录写入日志。如果使用RELEASE(COMMIT),还会发生以下事件:
- 餐桌空间锁被释放。
- 线程使用的所有存储空间都被释放,包括骨架光标表(SKCT)、骨架包表(SKPT)和工作区的存储空间。
- DBD的使用次数减少一次。 如果EDM DBD缓存需要空间,当DBD的使用次数达到零时,就可以释放它。
- 那些没有索赔人的表格空间和索引空间将被推迟关闭。
- 线程终止,会计记录写入。 会计记录不会记录线程创建之前的交易活动。
如果使用RELEASE(DEALLOCATE)来释放表空间锁,则DBD使用计数会减少,线程存储也会被释放。