SQLのINSERT/UPDATE文でデータ更新時にインデックスを作成しない方法
これは InterSystems FAQ サイトの記事です。
SQLのINSERT/UPDATE/DELETE文で大量のデータを更新する際に、高速化する方法をご紹介します。
以下の2つの手順を実行することで、更新処理のパフォーマンスを向上させることが可能です。
1.INSERT/UPDATE/DELETE時にインデックスを作成せず、あとでまとめて作成する
2.INSERT/UPDATE/DELETE時にジャーナルをOFFにする
1は、%NOINDEX キーワードを指定してインデックスの生成を後でまとめて行うことで、インデックスの構築を抑制しパフォーマンスを向上させる方法です。
クエリ実行例は、以下のようになります。
例:
UPDATE %NOINDEX tablename …
INSERT %NOINDEX INTO tablename …
DELETE %NOINDEX FROM tablename ...
更新後、あとでまとめてインデックスを再構築する場合は管理ポータルで行う方法と、コマンドで行う方法の2種類があります。
◆ 管理ポータルの場合...
[システムエクスプローラ] > [SQL]
(ネームスペース指定&テーブルを選択して) アクション - テーブルのインデックスを再構築...
◆ コマンドの場合...
Set sc = ##class(Schems.TableName).%BuildIndices()
2は、データ作成時にジャーナルをオフにすることでパフォーマンスを向上させます。
ただし、トランザクションのロールバックにはジャーナルが必要ですので、ロールバックを正しく動作させたい場合にはこの方法は使用しないでください。
また、こちらの機能は、ミラーリング対象のデータベースには使用できません。
方法は以下のようになります。
do DISABLE^%SYS.NOJRN // ジャーナリングを停止do ENABLE^%SYS.NOJRN // ジャーナリングを開始ディスカッション (0)0