DB2 Text Search,第 5 部分: 调度 DB2 Text Search 索引更新

IBM® DB2® Text Search 让用户能够在 DB2 for Linux®, UNIX®, and Windows® 数据库中创建全文本索引。全文本索引是异步更新的,并且需要显式和定期地启动文本索引更新,以确保索引正确地反映基表的内容。可以使用一种方便的机制来自动化这一过程,即使用一个调度程序以所需的频率启动定期更新。本文介绍关于调度选项的信息,并讨论默认调度机制的故障诊断。

Marion Behnen, DB2 Text Search 开发, IBM

Marion Behnen 是 IBM Software Group 的高级软件工程师,担任 DB2 全文本搜索技术主管。她拥有超过 20 年的数据库应用程序开发、企业报告、数据仓库和业务流程集成的经验。在加入 IBM 之前,她参与过与业务流程和数据集成相关的各个方面的工作,尤其是制造业。


developerWorks 投稿作者

Kiran Kumar, DB2 文本搜索 QA, IBM

Kiran KumarKiran Kumar 是 IBM India Software Labs 的一名软件工程师。他是一名经过认证的 Advanced DB2 管理员和质量工程师,有两年 DB2 中全文本搜索方面的经验,包括 DB2 Text Search。



2012 年 12 月 07 日

免费下载:IBM® DB2® Express-C 10.1 免费版 或者 DB2® 10.1 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

DB2 Text Search 让用户可以发出 SQL 和 XQuery 语句,以在 DB2 数据库中存储的数据上执行文本搜索查询。在一个表列上创建文本索引后,初始的更新将从表内容填充索引。然而,跟其他数据库索引不同,文本索引不是在文档被插入、更新或删除时立即更新的。相反,为确保得到正确的搜索结果,必须应用一个增量更新,以同步文本索引的内容和表列的内容。不是手动启动增量更新,可以将文本索引调度为自动更新。


调度机制

DB2 Text Search 提供两个接口来初始化索引更新:一个通过命令行接口,另一个通过存储过程接口。任何允许调用此类操作的调度机制都可以用来将文本搜索索引更新集成到调度工作流中。例如,对于数据库 TESTDB 中的文本索引 TEST.MYTXIDX,可以用以下操作之一启动更新:

  • db2ts update test.mytxidx for text connect to testdb
  • call sysproc.systs_update('TEST', 'MYTXIDX', '', 'en_US', ?)
  • call sysproc.systs_admin_cmd('update index test.mytxidx for text', 'en_US', ?)

作为一个集成的调度机制,DB2 10.1 中的 DB2 Text Search 提供选项来为 DB2 Administrative Task Scheduler 调度任务,这通过在创建或更改文本搜索索引时指定更新频率来实现。自动创建的调度任务执行一个对 sysproc.systs_admin_cmd('update index indexname for text with update minimum', language , ?) 的调用。只要数据库是活动的,DB2 Administrative Task Scheduler 将根据指定的频率触发更新。这件事情的发生跟文本搜索服务器的状态无关。

对于需要其他更新选项的索引(例如,如果使用了 allrows 选项来强迫重建而不是增量更新),必须手动创建调度任务。


如何使用 DB2 Administrative Task Scheduler

本节简要介绍跟文本搜索索引调度有关的一些核心调度特性。有关详细信息,请参阅 The administrative task scheduler

启用调度程序

Administrative Task Scheduler(管理任务调度程序)默认是禁用的,因此必须先启用后才能调度文本索引更新。要启用调度程序:

  1. DB2_ATS_ENABLE 注册表变量设置为 YES、TRUE、1 或 ON。
  2. 确保表空间 SYSTOOLSPACE 存在。

设置 DB2_ATS_ENABLE 注册表变量之后,为让该变量生效,必须重新启动实例。类似于几个其他的工具和过程,调度程序需要 SYSTOOLSPACE 表空间。如果数据库还未存在该表空间,请参考 Setting up the administrative scheduler,了解关于如何手动创建 SYSTOOLSPACE 的信息。没有现有的 SYSTOOLSPACE 表空间,指定一个更新频率以调度自动索引更新就会失败,提示出错。

如果 DB2_ATS_ENABLE 注册表变量设置为 OFF,那么可以指定更新频率和创建调度任务,但是调度程序不会活跃,也不会触发索引更新。

创建、更改和删除调度任务

对于通过文本搜索接口自动创建的调度任务,会被分配一个生成的任务名,且更新频率自动转换为 cron 格式。生成的任务名由前缀 TSSCHED_ 加上一个惟一的 indexidentifier(也用于临时表和事件表)组成。

创建或更改文本索引时指定一个频率,以便按一周的天数、小时和分钟运行更新。例如:

  • 要每 30 分钟在整点和半点时运行一次更新,可使用:
    • db2ts "create index indexname for text on tablecolumn update frequency D(*) H(*) M(0,30)"
    • db2 "call sysproc.systs_create(indexschema, indexname, tablecolumn, 'UPDATE FREQUENCY D(*) H(*) M(0,30)', 'en_US',?)"
  • 要修改一个调度,以便在整点过 10 分钟后每 20 分钟运行一次更新,可使用:
    • db2ts "alter index indexname for text update frequency D(*) H(*) M(10,30,50)"
    • db2 "call sysproc.systs_alter(indexschema, indexname, 'UPDATE FREQUENCY D(*) H(*) M(10,30,50)', 'en_US',?)"
  • 要删除一个调度程序任务,可使用:
    • db2ts "alter index indexname for text update frequency NONE"
    • db2 "call sysproc.systs_alter(indexschema, indexname, 'UPDATE FREQUENCY NONE','en_US',?)"

关于更新频率选项的详细信息,请参阅 SYSTS_ALTER procedure - Change the update characteristics of an index

取决于用户的特权,影响频率参数的管理命令对于任务状态会具有不同的结果。如果用户不具有 DBADMIN 特权,那么一个调度只能由创建它的用户修改或删除。这将防止出现孤儿任务和相关的清理步骤。下表简单列出了这些效果。

表 1. 修改调度频率时用户特权对调度任务状态带来的影响
同一用户或 DBADMIN不同用户
任务存在,是任务存在,否任务存在,是任务存在,否
按频率创建修改1添加任务--------
更改 - 添加频率修改1添加任务--------
更改 - 改变频率修改任务添加任务警告 '现有任务'添加任务2
更改 - 删除频率删除任务跳过2独立任务n/a2
删除索引(按频率)删除任务跳过2独立任务n/a2

1 如果相同名称的调度任务已存在,则会修改该任务,以便按指定频率执行索引更新。

2 在这些情况下,任务应该存在,但实际上并不存在,比如说被显式删除。

调度任务和任务状态

可在文本索引的事件表和调度任务状态表中找到更新状态信息。eventtablename 具有前缀 TSEVENT_,后跟一个识别符 nnnnnn。同样的识别符也用于调度程序任务名。

  • 可利用查询 db2 "select eventtablename from sysibmts.tsindexes where indexschema = 'indexschema' and indexname = 'indexname'" 找到事件表名
  • 查看更新消息: db2 "select message from sysibmts.tsevent_nnnnnn"
  • 查看已调度的任务: db2 "select * from systools.admin_task_list"
  • 查看为文本索引创建的已调度任务: db2 "select * from systools.admin_task_list where name like 'TSSCHED_%'"
  • 查看调度任务的状态: db2 "select name, status, sqlcode from systools.admin_task_status"

规划更新调度时需考虑的因素

授权

无论采用哪种调度机制,每个文本索引更新操作都需要用户具有适当的数据访问特权,以及 SYSTS_MGR 角色。此外,如果使用的是集成的调度机制,那么用户必须具有执行特权来添加、更改和删除调度程序任务。用户利用访问特权创建新的调度程序任务。

文本搜索索引调度任务遵守 DB2 Administrative Task Scheduler 访问管理。具有 SYSTS_MGR 角色、但是不具有 DBADMIN 特权的用户,将只看到他们自己的调度,不会看到其他具有 SYSTS_MGR 角色的用户创建的调度。所以,建议由专门用户管理文本搜索调度。这也有助于跟踪工作负载影响。

频率和工作负载

更新频率通常被安排为适应增量更新。如果在创建文本索引时指定了更新频率,那么第一个调度的任务将执行一次初始更新。根据初始更新的工作负载大小,建议创建不带调度的文本搜索索引,执行初始更新,然后才将调度添加到自动触发的增量更新。

DB2 Administrative Task Scheduler 使用一种 cron 格式,并允许指定一周中的天、小时和分钟,以及月和日。如果想要的调度不能用文本搜索索引更新频率设置进行表示,那么可以在需要时利用 DB2 Administrative Task Scheduler 工具和存储过程 sysproc.systs_admin_cmd('update index indexname for text options', 'language',?) 手动创建一个调度任务。例如,您可能会指定的一个选项是 with update minimum 或更新自动提交选项。

为了避免调度冲突,不要混合为文本搜索索引自动生成和手动创建的调度任务。

文本搜索索引更新被作为批更新处理,在此期间,对系统形成重大的负载。在为多个文本索引定义更新频率时,请考虑为系统配置的所允许并行更新的最大数量。记住,对于多分区系统,单个文本索引更新默认针对所有参与节点上的相关集合进行并行处理,因此更新进程计数必须考虑集合数量。

每次增量更新操作都检查有冲突的操作,如果索引被另外一个进程锁定,就会返回错误 CIE0357E Conflicting administration operation in progress。否则,它继续检查将更新的行是否超出更新最小值。如果有足够的行处理,就会应用一个截至时间戳,在截至时间之后发生的更改将在下一次更新中进行处理。

为了最小化处理成本(例如,在数据以非常难以预见的方式发生更改的情况下),手动创建多个带有非冲突定时和不同的更新最小值阈值的调度任务是危险的,比如说对带有较大更新最小值的更新操作每 10 分钟检查一次,对没有最小值或者带有较小更新最小值的更新操作每 30 分钟检查一次。


故障诊断

  • 要验证调度任务是否被触发,可使用调度任务状态。只有用于索引的数据可用,才会创建事件表消息。
  • 如果期望的数据在搜索结果中不可用,那么检查索引更新被执行:
    1. 验证环境变量已设置,且数据库是活动的。
    2. 在事件表中检查错误消息。
    3. 对于增量更新,确定临时表中的项数是否超出指定的更新最小值。
    4. 验证 SYSTOOLS.ADMIN_TASK_LIST 中的调度任务和 SYSTOOLS.ADMIN_TASK_STATUS 中的任务状态。
  • 要删除生成的调度,可使用 db2ts alter index indexname for text update frequency none 命令或相应的存储过程。如果生成的已调度任务被误删(例如,利用 systools.admin_task_remove ),那么通过在更改命令中指定更新频率来重新创建该调度任务。
  • 如果文本索引被删除,或者由一个不是索引创建者并且不具有 DBADMIN 特权的用户更改了文本索引和删除了频率,那么可作为具有 DBADMI 特权的用户删除该孤儿调度任务。使用 systools.admin_task_remove 过程,例如 db2 "call systools.admin_task_remove('TSSCH_111713',NULL)"

以前版本升级方面的注意事项

  • 当升级那些频率设置为 DB2 10.1 的现有文本搜索索引时,文本搜索索引的升级过程试图自动创建调度任务。这需要已经为实例启用了 DB2 Administrative Task Scheduler 设置。确保在升级数据库之前 SYSTOOLSPACE 已存在。
  • 如果无法在升级期间创建调度任务,可使用文本操作的 alter index 来添加调度任务。

示例场景:调度文本索引

创建并填充表

清单 1. 创建表 BOOKS 并插入样例数据
CREATE TABLE books ( isbn VARCHAR(18) NOT NULL PRIMARY KEY,
author VARCHAR(300), title LONG VARCHAR, year INTEGER, bookinfo XML)

INSERT INTO books VALUES ('123-014014014', 'Joe Climber','Climber''s
Mountain Tops',2001,XMLPARSE(DOCUMENT '<bookinfo> <author>Joe Climber</author>
<title>Climber''s Mountain Tops</title><story>This vivid description of
Joe Climber''s experiences when tackling the mountains of his native Mountainland
lets you hold your breath when you follow Joe on his adventures in the regions
where the air is thin and the weather is treacherous. Includes beautiful color photos of 
Moun-tainland''s mountain ranges.</story> <year>1995</year> 
<price>16.00</price> <pages<176</pages></bookinfo>'));
                
INSERT INTO books VALUES ('678-014014078', 'Joe Smith', 'The Range', 2001,
XMLPARSE(DOCUMENT '<bookinfo> <author>Joe Smith</author>
<title>The Range</title> <story>All you need to know about
kitchen ranges. A pictured description based on the most recent ergonomics
studies for everybody who is involved in food preparation in the home.</story>
<year>1991</year> <price>6.00</price> <pages>76
</pages> </bookinfo>'));

请注意,文本索引需要已经为该表定义了一个主键。

创建并调度文本索引

下面的命令创建一个名为 title_indx 的文本索引,如果至少有两个项需要更新,则调度程序任务会 24x7 每五分钟更新一次该文索引。第一次开始更新时,无论表中的行数为多少,调度程序都将对这个新索引执行一次初始更新。

清单 2. 创建一个在列 'title' 上带有更新调度的文本索引
db2ts "create index db2ts.title_indx for text on books(title) update frequency
    D(*) H(*) M(0,5,10,15,20,25,30,35,40,45,50,55) update minimum 2 connect to testdb"

在列标题上创建文本索引并调度增量更新

初始更新通常涉及到比增量更新大得多的工作负载,因此一般不太适合用于管理增量更新的调度。为了避免在不适当的时间为初始更新处理大的工作负载,可手动运行第一次更新,并且只有在初始更新成功完成后才添加调度。

在下面的例子中,调度再次被设置为:如果至少有两个项需要处理,则每五分钟运行一次增量更新。

清单 3. 在列标题上创建文本索引并调度自动增量更新
db2ts "create index db2ts.title_indx for text on books(title) connect to testdb"

db2ts "update index db2ts.title_indx for text connect to testdb"

db2ts "alter index db2ts.title_indx for text update frequency 
    D(*) H(*) M(0,5,10,15,20,25,30,35,40,45,50,55) update minimum 2 connect to testdb"

查看更新和调度信息

从文本索引目录检索事件表名称,并记录名称以备后用。注意数字后缀,这也是用于调度任务的惟一识别符。

清单 4. 获得事件表名称
db2 "select substr(eventtablename,1,30) as eventtable from sysibmts.tsindexes 
where indexname='TITLE_INDX'"
                
EVENTTABLE
------------------------------
SYSTSEVENT_111713
                
1 record(s) selected.

事件表包含状态消息和统计信息,以及在更新处理过程中出现的警告或错误。 请注意:为了可读性,消息输出已截短。

清单 5. 查看事件表中的消息
db2 "select substr(message,1,100) from sysibmts.TSEVENT_111713"
                
1
--------------------------------------------------------------------------------
CIE00003 Index update started.
CIE00011 Index build started.
CIE00012 Index build ended.
CIE00004 Index update ended.
CIE00005I DB2 Text Search Index update statistics: "2" number of rows processed. 
                
5 record(s) selected.

通过 DB2 Administrative Task Scheduler 的过程和视图可看到调度信息。

清单 6. 查看调度任务
db2 "select substr(name,1,12) as name, taskid, substr(schedule,1,50) as schedule from 
systools.admin_task_list where name ='TSSCH_111713'"
                
NAME            TASKID      SCHEDULE
------------   ------      --------------------------------------------------
TSSCH_111713        1       0,5,10,15,20,25,30,35,40,45,50,55 * * * *
                
1 record(s) selected.
清单 7. 查看文本索引调度的任务状态
db2 "select status,sqlcode from systools.admin_task_status where name='TSSCH_111713'"
                
STATUS     SQLCODE
---------- -----------
COMPLETE             0
COMPLETE             0
COMPLETE             0
                
3 record(s) selected.

结束语

DB2 Text Search 索引是异步更新的。索引更新可以手动启动,也可以调度为自动触发。

  • 索引更新可以通过使用命令行或存储过程接口进行调度。提供有一个集成的调度管理,适用于最常见的调度场景,并且是基于 DB2 Administrative Task Scheduler 的。
  • 在规划文本索引调度频率时,只有当单个调度任务满足于文本索引时才使用集成的调度管理,否则,为这个索引手动创建更新调度任务。
  • 为避免资源冲突,调整并行文本索引更新的最大数量,以匹配 Text Search 服务器资源配置,并适当错开多个文本索引更新。
  • 必要时,重新审查事件表的统计信息,以调整调度频率。

下载

描述名字大小
样例 DB2 CLP 脚本scheduling_textindexes.zip4KB

参考资料

学习

获得产品和技术

  • 利用 IBM 试用软件(可从 developerWorks 直接下载),构建您的下一个开发项目。
  • 现在您可以免费使用 DB2。下载 DB2 Express-C,这是一款针对社区的免费版 DB2 Express Edition,它跟 DB2 Express Edition 提供相同的核心数据特性,并为构建和部署应用程序提供一个坚实的基础。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=852055
ArticleTitle=DB2 Text Search,第 5 部分: 调度 DB2 Text Search 索引更新
publish-date=12072012