要使用存储过程搜索,需要在执行 CREATE INDEX 命令期间指定高速缓存选项。这通过将指定的所有数据移入主内存中来获取高性能。
但是,在用于搜索的第一次索引更新之前,确保表包含文档以避免更新未填充表的索引。这样可获得更好的建立索引性能和准确地估计高速缓存需求。
存储过程搜索可以快速返回与文档相关联的预定义数据。在 CREATE INDEX 命令中使用高速缓存表选项来进行定义。然后,ACTIVATE CACHE 命令将指定的数据移入内存高速缓存中。
如果没有对视图创建文本索引,则 SQL 标量搜索函数也可以使用此文本索引。
在分布式 DB2 环境中,必须为存储过程在单个节点上为管理表显式指定表空间,并在此节点上显式调用。
为了确保连接至正确的节点,使用 DB2NODE 环境变量。
当为存储过程搜索创建文本索引时,必须确定和计算下列参数:
提供了下列类型的高速缓存:
提供了下列方法来更新文本索引:
这也称为增量更新。
如果期望在初始索引激活之后插入超过 50% 的文档,则使用此选项。
Net Search Extender 提供了两个 SQL 函数来帮助您确定 CREATE INDEX 内存参数。这两个 SQL 函数为:MAXIMUM CACHE SIZE 和 PCTFREE。
DB2EXT.MAXIMUM_CACHE_SIZE(maximumNumberDocs INTEGER, averageRowLength INTEGER, numberOfCacheColumns INTEGER)以下命令将返回表的平均行长度参数:
SELECT AVG(LENGTH(cache column_1) + ... + LENGTH(cache column_n))注意,如果将更多文档插入到表中,则平均值可能会极大地更改。高速缓存列数目与在 DB2TEXT CREATE INDEX 命令的 CACHE TABLE 子句中使用的列表达式数目相关。
要获取更多信息,请参阅附录B. 使用大量内存。
DB2EXT.PCTFREE(actualNumberDocs INTEGER, maximumNumberDocs INTEGER)实际文档数是第一次执行 ACTIVATE CACHE 命令(该命令将创建内存高速缓存)时表中的行数。
最大文档数是在运行下一个 DB2TEXT ACTIVATE 命令(对于临时高速缓存)或 DB2TEXT ACTIVATE CACHE RECREATE 命令(对于持久高速缓存)之前估计的表中的最大文档数。
如果每次更新时都重新创建索引,则将 PCTFREE 值设置为 0。
假定您的表中具有 10000 行,而您不期望超过 20000 行。使用以下调用来计算您需要的 PCTFREE 值:
db2 "values DB2EXT.PCTFREE(10000,20000) "
假定最大行大小为 20000,且在高速缓存中具有平均大小为 76 的两列。使用以下调用来返回该大小:
db2 " values DB2EXT.MAXIMUM_CACHE_SIZE(20000,76,2) "
在确定合适的参数之后,可以使用以下调用来创建索引和高速缓存表:
db2text CREATE INDEX db2ext.comment FOR TEXT ON db2ext.texttab (comment) CACHE TABLE (docid) PCTFREE 10 MAXIMUM CACHE SIZE 5
在此示例中,除了通过将主内存用于快速返回结果表构建索引之外还构建了 docid 列。保留 10% 的高速缓存供以后的文档使用,并限制高速缓存最多为 5 MB。
要对此索引进行搜索,需要更新该索引然后激活它。这会将指定的表高速缓存表达式从数据库复制到内存中。
如果在执行 ACTIVATE 或 UPDATE 操作期间,超过了 MAXIMUM CACHE SIZE,则建议执行下列操作:
如果期望频繁更新文档,则考虑在 CACHE TABLE 子句中将固定大小的数据类型用于高速缓存列表达式。以下示例说明如何在多次更新操作期间使用相同的高速缓存存储器:
CACHE TABLE(cast(C1 as char(20)), cast(substr(C2,1,10) as char(10))....
在此情况下,确保只使用了非可变数据类型。
在激活高速缓存之前,执行任何暂挂的增量更新来避免较差的 PCTFREE 计算。
要激活文本索引,使用以下命令:
db2text ACTIVATE CACHE FOR INDEX db2ext.comment FOR TEXT
此命令将指定的高速缓存表数据从数据库中检索出来,并将此数据存储在内存中。所用的时间取决于表的大小。
如果在激活了索引时调用 update index,这也会更新高速缓存表。由于已删除的文档可能也会占用高速缓存中的槽,因此应确保将 PCTFREE 设置为足够大的值。
每当停止系统时,就需要重新执行 ACTIVATE CACHE 调用。如果使用持久高速缓存,则新的激活将更快。
如果在没有激活持久高速缓存时进行了更新,则在调用激活期间将删除持久高速缓存然后再重新创建它。
为了节省资源,还应该取消激活当前不需要的任何索引。
要检查剩下多少内存,可使用以下调用:
db2text control show cache status for database cte index db2ext.comment
这将显示是否已经激活了索引以及指定的高速缓存空间还剩下多少。