はい。できます。
ただし、再構築中は更新途中の状態で参照されますので、以下、専用ユーティリティを使用することをお勧めします。
2022.1以降では、$SYSTEM.SQL.Util.SetMapSelectability()を使用します。
(2021.1以前では、$SYSTEM.SQL.SetMapSelectability()を使用します。引数の指定方法は2022.1以降と同様です。)
手順は以下の通りです。
- 追加予定のインデックス名をクエリオプティマイザから隠します。
- インデックス定義を追加し、再構築を実施します。
- 再構築が完了したら、追加したインデックスをオプティマイザに公開します。
実行例は以下の通りです。
Sample.Person の Home_State(連絡先住所の州情報)カラムに対して標準インデックス HomeStateIdx を定義する目的での例で記載します。
//1、追加予定のインデックス名をクエリオプティマイザから隠します。
>write $system.SQL.Util.SetMapSelectability("Sample.Person","HomeStateIdx",0)
1
// 2、インデックス定義を追加した後、再構築を実施します。
// 定義例)Index HomeStateIdx On Home.State;
>do ##class(Sample.Person).%BuildIndices($LB("HomeStateIdx"))
// 3、再構築が完了したら、追加したインデックスをオプティマイザに公開します
>write $system.SQL.Util.SetMapSelectability("Sample.Person","HomeStateIdx",1)
1
※2021.1以前では、write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",0) をご利用ください(クラス名が異なります。引数は2022.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 アクティブシステム上でのインデックスの構築について