当前位置:首页 > 问答 > 正文

DB2里头并行索引怎么建和维护,操作步骤其实没那么复杂

在DB2数据库里头,说到并行索引,其实核心思想就是“人多力量大”,让数据库同时动用多个任务或者叫进程,一起来完成创建或者重建索引这个本来可能很慢的活儿,这就像一个人搬一堆砖很累很慢,但找一群人一起搬,速度就快多了,下面就直接说怎么操作和后续的维护。

并行索引的建立

根据IBM官方知识中心关于“并行索引创建”的说明,DB2允许在创建索引时使用ALLOW PARALLELISM参数来启用并行处理,具体操作步骤其实不复杂:

  1. 基本语法: 就是在我们平时写的那条创建索引的SQL语句后面,加上一个子句,平常你可能是这么写的:CREATE INDEX INDEX_NAME ON TABLE_NAME (COLUMN_NAME),要让它并行起来,就改成:CREATE INDEX INDEX_NAME ON TABLE_NAME (COLUMN_NAME) ALLOW PARALLELISM

  2. 关键参数ALLOW PARALLELISM 这个参数是告诉DB2:“这个建索引的活儿,你可以看着办,用几个任务一起干都行,你自己决定最优的并行度。” DB2的优化器会根据当前系统的负载、可用的CPU核心数以及表的大小等因素,自动选择一个它认为合适的并行度,根据DB2文档对“intra_parallel”数据库管理配置参数的描述,数据库的并行性必须被启用(即intra_parallel参数设置为YES或AUTO),ALLOW PARALLELISM选项才能生效。

  3. 更精细的控制 - CPU_PARALLELISMIO_PARALLELISM 如果你觉得让DB2自动决定还不够,想自己指定用多大劲儿,DB2还提供了更详细的参数,根据DB2信息中心关于“CREATE INDEX”语句的详细规格,你可以这样写: CREATE INDEX INDEX_NAME ON TABLE_NAME (COLUMN_NAME) USING IBM605 INDEX EXTENSION CPU_PARALLELISM 4 IO_PARALLELISM 8 这里的CPU_PARALLELISM指的是处理数据时用的并行任务数,比如排序、比较这些计算活儿的并发数。IO_PARALLELISM指的是从磁盘上读取表数据时的并行任务数,这两个值具体设多少,得看你的系统资源,比如CPU有几个核心,磁盘阵列的性能如何,一般刚开始如果不确定,先用默认的或者只指定ALLOW PARALLELISM让系统自动调整是比较稳妥的做法。

    DB2里头并行索引怎么建和维护,操作步骤其实没那么复杂

  4. 注意事项:

    • 环境准备: 再次强调,数据库的intra_parallel参数必须设置成支持并行才行,否则你写了ALLOW PARALLELISM也没用。
    • 资源消耗: 并行操作虽然快,但它是用更多的CPU、内存和I/O带宽换来的,在业务高峰期做大规模索引的并行创建,可能会对正在运行的其他业务查询造成性能影响,所以通常建议在系统负载低的维护时间窗口进行这类操作。
    • 表锁: 创建索引时,DB2会对表加上相应的锁,根据DB2锁机制的解释,创建索引通常需要获取比较高级别的锁(比如排他锁-Z锁),这可能会阻塞其他会话对表的写操作甚至读操作,并行创建本身不改变锁的级别,但它因为完成得快,所以缩短了锁持有的时间,这本身也是对并发性能的一种改善。

并行索引的维护

索引建好了不是一劳永逸的,随着数据不断的增删改,索引会变得零散(术语叫索引碎片化),查询效率会下降,这时候就需要重建索引,重建索引同样可以利用并行来加速。

  1. 使用REORG INDEXES命令: 这是DB2里最常用的索引重组和重建命令,根据DB2信息中心对“REORG INDEXES”命令的说明,这个命令本身在运行时,如果系统环境支持并行(intra_parallel为YES或AUTO),并且索引对象本身允许并行访问,那么DB2可能会自动采用并行方式来执行重组操作,也就是说,对于之前用并行方式创建的索引,或者即使不是并行创建但DB2认为合适的索引,在重组时都可能自动并行。

    DB2里头并行索引怎么建和维护,操作步骤其实没那么复杂

  2. 显式指定并行重建: 如果你想在重建时明确要求并行,可以结合INDEXES ALL选项和系统的并行设置。REORG INDEXES ALL FOR TABLE SCHEMA.TABLENAME ALLOW PARALLELISM,这个命令会重组指定表的所有索引,并允许DB2使用并行处理,这里ALLOW PARALLELISM的作用和创建索引时类似。

  3. 另一种重建索引的方法是先删除(DROP INDEX)再重新创建(CREATE INDEX),如果你选择这种方法,那么在重新创建的时候,按照上面第一部分讲的,在CREATE INDEX语句中加上ALLOW PARALLELISM参数即可实现并行重建。

  4. 维护时机: 根据DB2性能调优指南的建议,不需要动不动就重建索引,可以通过查询系统目录视图,比如SYSCAT.INDEXES中的统计信息,或者使用db2pd -tcbstats等工具,来观察索引的碎片化程度,当碎片化达到一定程度(比如超过20%),或者明显感觉到基于该索引的查询速度变慢时,再考虑在维护窗口进行重建。

在DB2里搞并行索引,建立的时候就是在CREATE INDEX语句后加ALLOW PARALLELISM,想让控制更精细就用CPU_PARALLELISMIO_PARALLELISM,维护的时候,主要是用REORG INDEXES命令,这个命令在并行环境 enabled 的情况下本身就可能并行执行,也可以显式指定ALLOW PARALLELISM,核心前提是确保数据库的intra_parallel参数是打开状态,操作步骤本身不复杂,关键是要理解并行会消耗更多资源,所以要选对时机,避免影响生产业务。