データベース・クリーナを起動し、実行できる期間の最大値を設定します。
sa_clean_database( [ duration ] )
duration クリーン操作の実行が許可される時間 (秒単位)。引数の指定がない場合、または 0 が指定された場合、データベース・クリーナは DB 領域内のすべてのページのクリーンアップが終了するまで実行を続けます。
データベース・クリーナは、デフォルトのスケジュールで実行される内部タスクです。このシステム・プロシージャを使用すると、データベース・クリーナを強制的にただちに実行したり、クリーナの起動のたびにその実行時間を指定したりできます。
要求の一部を後で実行すると、スナップショット・アイソレーション・トランザクション、インデックス管理、ローの削除などのデータベース・タスクをより効率的に実行できます。このような後回しにできるアクティビティには、一般的に、削除済みエントリ、履歴エントリなどの不要なエントリをデータベース・ページから削除することによるクリーンアップや、アクセス効率を上げるためのデータベース・ページの再編成などがあります。
こうしたアクティビティを後で実行することにより、現在の要求がより高速に処理されるだけでなく、データベース・サーバの負荷が軽いときにクリーンアップを実行する余地が生まれます。不要なエントリが区別されて、他のトランザクションから認識できなくなりますが、ページ上の領域は使用しているので、いつかは削除する必要があります。
データベース・クリーナは、後回しにされたクリーンアップ・アクティビティを実行します。データベース・クリーナは、20 秒ごとに実行されるようスケジュールされています。起動されると、データベースを DB 領域全体にわたって順次読み出し、クリーンアップ可能なページを検証してクリーニングし、次のページへ移ります。データベース・クリーナは、データベース・サーバによって自動的に起動された場合は、セルフチューニング・プロセスになります。データベース・クリーナによる作業量と実行時間は、DB 領域内の未処理のクリーンアップ可能ページの割合、データベース・サーバの現在のアクティビティ量、データベース・クリーナがすでにクリーンニングに費やした時間など、いくつかの要因に左右されます。0.5 秒間実行した後に、クリーナがサーバでアクティブな要求を検出した場合、クリーナは停止し、通常の間隔で実行するよう自らをスケジュールし直します。データベース・クリーナは、サーバで実行されている要求が他にないときにページ処理を試行することで、サーバの休止時間を活用します。
データベース・クリーナの統計情報は、次の 4 つのデータベース・プロパティから取得できます。
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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |