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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 系统对象 » 系统过程 » 按字母顺排序的系统过程列表

 

sa_clean_database 系统过程

启动数据库清理程序,并设置可运行的最长时间。

语法
sa_clean_database( [ duration ] )
参数
  • duration   清理操作允许运行的秒数。如果未指定参数或指定的参数为 0,则数据库清理程序将一直运行,直至所有 dbspace 中的所有页均已清理。

注释

数据库清理程序是在缺省调度上运行的内部任务。可使用此系统过程强制数据库清理程序立即运行,以及指定每次调用清理程序时其可运行的时间。

如果将请求的某些部分推迟到以后执行,则某些数据库任务(例如处理快照隔离事务、索引维护和删除行)的执行会更为有效。这些可推迟活动通常涉及通过从数据库页中删除已删除条目、历史条目和其它不必要的条目,或重组数据库页以便更有效访问而进行的清理。

推迟一些这样的活动不仅可使当前请求更快地完成,还可能允许在数据库服务器不太忙时执行清理操作。这些不必要的条目被标识,以便其它事务看不到它们;然而,它们确实占用页上的空间,在某些时候必须删除。

数据库清理程序执行任何推迟的清理活动。安排每 20 秒钟运行一次清理程序。调用清理程序时,数据库按顺序循环通过数据库的 dbspace,检查和清理每个可清理页,然后进入下 一个可清理页。当数据库清理程序由数据库服务器自动调用时,其为自我调节过程。数据库清理程序执行的工作量和执行的持续时间取决于几个因素,包括 dbspace 中未完成的可清理页的百分率、数据库服务器中当前的活动数量以及数据库清理程序已花费的清理时间量。如果在运行 0.5 秒后,清理程序检测到服务器中有活动请求,它将停止运行并重新调度其自己以定期执行。当服务器中没有其它请求执行时,数据库清理程序将尝试处理页,因此充分利用了服务器的非活动期间。

数据库清理程序统计信息可通过以下四个数据库属性来获取:

  • CleanablePagesAdded   返回需要进行清理的页数

  • CleanablePagesCleaned   返回已进行清理的页数

  • CleanableRowsAdded   返回需要进行清理的行数

  • CleanabledRowsCleaned   返回已进行清理的行数

值 CleanablePagesAdded 与 CleanablePagesCleaned 间的差值指明仍需进行清理的数据库页数。

可使用 sa_clean_database 系统过程来配置数据库清理程序,以运行直至数据库中的所有页均已进行清理,或指定数据库清理程序运行的最大持续时间。

要进一步自定义数据库清理程序的行为,可设置一个事件,当需要进行清理的页或行数超过指定阈值时,通过该事件启动数据库清理程序。请参见CREATE EVENT 语句

权限

需要 DBA 权限

副作用

另请参见
示例

以下示例将数据库清理程序的持续时间设置为 10 秒:

CALL sa_clean_database( 10 );

以下示例创建了一个调度事件,该事件每天运行以允许数据库清理程序运行,直至数据库中的所有页均已进行清理:

CREATE EVENT DailyDatabaseCleanup
SCHEDULE
   START TIME '6:00 pm'
   ON ( 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' )
   HANDLER
      BEGIN
         CALL sa_clean_database( );
      END;

以下示例在数据库中有不少于 20% 的页需要进行清理时强制数据库清理程序运行:

CREATE EVENT PERIODIC_CLEANER
SCHEDULE
BETWEEN '9:00 am' and '5:00 pm'
EVERY 1 HOURS
HANDLER
BEGIN
     DECLARE @num_db_pages INTEGER;
     DECLARE @num_dirty_pages INTEGER;

     -- Get the number of database pages
     SELECT (SUM( DB_EXTENDED_PROPERTY( 'FileSize', t.dbspace_id ) - 
                     DB_EXTENDED_PROPERTY( 'FreePages', t.dbspace_id ) ))
     INTO @num_db_pages
     FROM (SELECT dbspace_id FROM SYSDBSPACE) AS t;

     -- Get the number of dirty pages to be cleaned
     SELECT (DB_PROPERTY( 'CleanablePagesAdded' ) - 
                     DB_PROPERTY( 'CleanablePagesCleaned' ))
     INTO @num_dirty_pages;

     -- Check whether the number of dirty pages exceeds 20% of
     -- the size of the database
     IF @num_dirty_pages > @num_db_pages * 0.20 THEN
       -- Start cleaning the database for a maximum of 60 seconds
       CALL sa_clean_database( 60 );
     END IF;
END;