Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 查询和数据修改 » 全文搜索 » 文本索引概念和参考

 

文本索引刷新类型

在创建文本索引时,还必须选择一种刷新类型。支持的文本索引刷新类型有三种:立即、自动和手动。在创建时定义文本索引的刷新类型。可以在创建文本索引后更改刷新类型,但快速文本索引除外。

  • IMMEDIATE REFRESH   IMMEDIATE REFRESH 文本索引在基础表或实例化视图中的数据发生更改时进行刷新,仅当数据必须保持最新、索引列相对较短或数据更改不频繁时才建议对基表使用。

    文本索引的缺省刷新类型是 IMMEDIATE REFRESH。实例化视图文本索引仅支持 IMMEDIATE REFRESH。

    对已有 AUTO REFRESH 或 MANUAL REFRESH 文本索引,无法将其更改为 IMMEDIATE REFRESH 文本索引。相反,必须先将其删除,然后重新创建为 IMMEDIATE REFRESH 文本索引。

    IMMEDIATE REFRESH 文本索引支持所有隔离级别。它们会在创建时填充,并在此初始刷新过程中保持表或实例化视图的独占锁。

  • AUTO REFRESH   AUTO REFRESH 文本索引会按照所指定的时间间隔自动进行刷新,因此建议在可以接受某些数据过时的情况下使用。过时索引的查询返回自上次刷新后未更改的匹配行。因此,查询不会返回自上次刷新后所插入、删除或更新的行。

    满足以下一个或多个条件时,AUTO REFRESH 文本索引的刷新频率也可能要比所指定的间隔更频繁:

    • 距离上次刷新的时间大于刷新间隔。

    • 所有待执行行的总长度(sa_text_index_stats 系统过程返回的 pending_length)超过总索引大小(sa_text_index_stats 返回的 doc_length)的 20%。

    • 已删除的长度超过总索引大小 (doc_length) 的 50%。在这种情况下,将始终执行完全重建,而非增量更新。

    AUTO REFRESH 文本索引使用隔离级别 0 进行刷新。

    AUTO REFRESH 文本索引在创建时不包含数据,因此仅在首次刷新后才可用(首次刷新通常在创建文本索引后的一分钟之内进行)。还可以使用 REFRESH TEXT INDEX 语句手动刷新 AUTO REFRESH 文本索引。

    AUTO REFRESH 文本索引在重装过程中不会进行刷新,除非为 dbunload 指定 -g 选项。

  • MANUAL REFRESH   MANUAL REFRESH 文本索引仅接受由用户手动刷新,因此建议在以下情况下使用:基础表中的数据很少更改、可接受较大程度的数据过时,或者要在某个事件后或满足某个条件后进行刷新。过时索引的查询返回自上次刷新后未更改的匹配行。因此,查询不会返回自上次刷新后所插入、删除或更新的行。

    您可以定义自己的策略以刷新 MANUAL REFRESH 文本索引。在下面的示例中,使用以参数形式传递的刷新间隔,以及与用于 AUTO REFRESH 文本索引的规则相类似的规则来刷新所有 MANUAL REFRESH 文本索引。



    CREATE PROCEDURE refresh_manual_text_indexes( 
       refresh_interval UNSIGNED INT )
    BEGIN
     FOR lp1 AS c1 CURSOR FOR
       SELECT ts.*
       FROM SYS.SYSTEXTIDX ti JOIN sa_text_index_stats( ) ts
       ON ( ts.index_id = ti.index_id )
       WHERE ti.refresh_type = 1 -- manual refresh indexes only
     DO
       BEGIN
        IF last_refresh_utc IS null 
        OR cast(pending_length as float) / (
           IF doc_length=0 THEN NULL ELSE doc_length ENDIF) > 0.2
        OR DATEDIFF( MINUTE, CURRENT UTC TIMESTAMP, last_refresh_utc )
           > refresh_interval THEN
         EXECUTE IMMEDIATE 'REFRESH TEXT INDEX ' || text-index-name || ' ON "'
         || table-owner || '"."' || table-name || '"';
        END IF;
       END;
      END FOR;
    END;

    您可以随时使用 sa_text_index_stats 系统过程决定是否需要刷新,以及刷新应该是完整重建还是增量更新。

    MANUAL REFRESH 文本索引在创建时不包含数据,仅当对其进行刷新后才可用。要刷新 MANUAL REFRESH 文本索引,请使用 REFRESH TEXT INDEX 语句。

    MANUAL REFRESH 文本索引在重装过程中不会进行刷新,除非为 dbunload 指定 -g 选项。

 另请参见