記事
Tomoko Furuzono · 2021年10月19日 3m read

データの登録/削除が行われている間にインデックスを構築する方法

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

データの登録/削除が行われている最中にインデックスを構築(再構築)することは可能ですが、そのままインデックス構築を実施すると、更新途中の状態で参照されてしまいますので、専用ユーティリティを使用してインデックス構築を実施します。
手順は以下の通りです。

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

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

1、追加予定のインデックス名を Caché のクエリオプティマイザから隠します。 
SAMPLES>write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",0)
1


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

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

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

SAMPLES>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 アクティブシステム上でのインデックスの構築について

00
1 0 0 10
Log in or sign up to continue