記事
· 2023年4月11日 3m read

データ更新中にインデックスの再構築を実行する

これは、InterSystems FAQサイトの記事です。

データの登録/更新/削除を実行中でも、インデックスを再構築することは可能です。
ただし、再構築中は更新途中の状態で参照されますので、専用ユーティリティを使用することをお勧めします。
手順は以下の通りです。

  1. 追加予定のインデックス名をクエリオプティマイザから隠します。
  2. インデックス定義を追加し、再構築を実施します。
  3. 再構築が完了したら、追加したインデックスをオプティマイザに公開します。

実行例は以下の通りです。
Sample.Person の Home_State(連絡先住所の州情報)カラムに対して標準インデックス HomeStateIdx を定義する目的での例で記載します。 

1、追加予定のインデックス名を Caché のクエリオプティマイザから隠します。

>write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",0)
1

 

 2、インデックス定義を追加した後、再構築を実施します。
  定義例)Index HomeStateIdx On Home.State;

>do ##class(Sample.Person).%BuildIndices($LB("HomeStateIdx"))


 3、再構築が完了したら、追加したインデックスをオプティマイザに公開します

>write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",1)
1

インデックスが使用されたか/されないか、の確認はクエリプランを参照します。
以下の例では、ターミナルを $system.SQL.Shell() でSQL実行環境に切り替えた状態でのプラン確認結果を表示しています(管理ポータルで参照する場合は、クエリ実行画面でSQL実行後「プラン表示」ボタンを押下します)。 

SAMPLES>do $system.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <>.
Enter q to quit, ? for help.
SAMPLES>>select ID,Name from Sample.Person where Home_State='NY'
1.      select ID,Name from Sample.Person where Home_State='NY'
ID      Name
61      Alton,Debby O.
138     Isaksen,Charlotte L.
175     Walker,Emily O.
3 Rows(s) Affected
statement prepare time(s)/globals/lines/disk: 0.0026s/35/974/0ms
          execute time(s)/globals/lines/disk: 0.0017s/216/2447/0ms
                          cached query class: %sqlcq.SAMPLES.cls1
---------------------------------------------------------------------------
SAMPLES>>show plan    // ★ インデックス未使用時のプラン表示  DECLARE QRS CURSOR FOR SELECT ID , Name FROM Sample . Person WHERE Home_State = ?
Read master map Sample.Person.IDKEY, looping on ID.
For each row:
    Output the row.
SAMPLES>>show plan    // ★ インデックス使用時のプラン表示  DECLARE QRS CURSOR FOR SELECT ID , Name FROM Sample . Person WHERE Home_State = ?
Read index map Sample.Person.HomeStateIdx, using the given %SQLUPPER(Home_State), and looping on ID.
For each row:
    Read master map Sample.Person.IDKEY, using the given idkey value.
    Output the row.
SAMPLES>>

 

詳細は、以下ドキュメントをご参照ください。
READ および WRITE アクティブシステム上でのインデックスの構築について【IRIS】
READ および WRITE アクティブシステム上でのインデックスの構築について

また、下記の関連トピックもご確認ください。
アプリケーション使用中にインデックス再構築を複数プロセスで実行する方法
クエリをチューニングする方法
 

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください