記事
· 2024年4月25日 2m read

大きいデータを持つフィールドに対してインデックスを作成する方法

大きなサイズのデータを持つフィールドに対してインデックスを作成すると、<SUBSCRIPT>エラーとなることがあります。

これは、グローバルの添え字(サブスクリプト)のサイズには制限があり、制限を超えるとエラーとなるためです。

例えば、以下のようなインデックスの場合、

^Sample.PersonI("NameIdx"," xxx...xxx",1)       =       ""

グローバル名+サブスクリプト部(=の左側)が、エンコード文字数で最長 511 文字を超えるとエラーとなります(日本語の場合はもっと小さな文字数です)。

※ご参考:グローバル参照の最大長


大きいデータを持つカラムに対してインデックスを設定したい場合の回避策としては、こちらの ドキュメント にありますように
「該当のプロパティのインデックス照合文字列を任意の文字数(例:128文字)に制限した照合を定義」
する方法があります。


具体的には、以下の2つの方法になります。
※クラス定義の変更/保存/コンパイル+インデックスの再構築が必要です。

1. プロパティ定義で対応する:

Property Name as %String (COLLATION = "TRUNCATE(128)", MAXLEN = 300);
Index NameIdx On Name;   // インデックスは大文字小文字を区別する
// もしくは
Property Name As %String(COLLATION = "SQLUPPER(128)", MAXLEN = 300);
Index NameIdx On Name;   // インデックスはすべて大文字


2. インデックス定義で対応する:

Property Name As %String(COLLATION = "TRUNCATE", MAXLEN = 500);
Index NameIdx On Name As TRUNCATE(128);   // 大文字小文字を区別
// もしくは
Property Name As %String(MAXLEN = 500);
Index NameIdx On Name As SQLUPPER(128);   // インデックスはすべて大文字


1の場合は、指定されたフィールドの文字列がインデックスとして使用されるたびに (order by クエリ、where ステートメントなど)、その文字列が自動的に切り捨てられます。

こちらの対応を行うことで、<SUBSCRIPT>エラーは回避できますので、お試しください。


enlightened【ご参考】
Cachéでの照合

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