Firebirdは、2.0以降です。これには、ユーザー定義関数(UDF)の呼び出しを使用します。キーサイズがUDF呼び出しの式のインデックスの実装制限を超えています
現在、私はこのテーブルに表現インデックスを追加しようとしています:それは、すでに表現インデックスがM_ADSN_STRING_DATA_AD_UC
と呼ばれたこと
CREATE TABLE M_ADSN_STRING_DATA (
ID DMN_AUTOINC NOT NULL /* DMN_AUTOINC = INTEGER NOT NULL */,
CLTREF DMN_REFID /* DMN_REFID = INTEGER NOT NULL */,
ATTRIBUTEDATA DMN_AFT_STRING /* DMN_AFT_STRING = VARCHAR(320) NOT NULL */
);
/******************************************************************************/
/**** Unique constraints ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT UNQ_M_ADSN_STRING_DATA UNIQUE (CLTREF, ATTRIBUTEDATA);
/******************************************************************************/
/**** Primary keys ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT PK_M_ADSN_STRING_DATA PRIMARY KEY (ID);
/******************************************************************************/
/**** Foreign keys ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT FK_M_ADSN_STRING_DATA_CLT FOREIGN KEY (CLTREF) REFERENCES M_CLIENT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
/******************************************************************************/
/**** Indices ****/
/******************************************************************************/
CREATE INDEX M_ADSN_STRING_DATA_AD_UC ON M_ADSN_STRING_DATA COMPUTED BY (UPPER(ATTRIBUTEDATA));
注意を。
私が使用したいインデックスは次のようになります。
CREATE INDEX M_ADSN_STRING_DATA_AD_DIG
ON M_ADSN_STRING_DATA
COMPUTED BY (F_DIGITS(ATTRIBUTEDATA));
残念ながら、これは私にエラーメッセージを表示します。
失敗したメタデータの更新 キーサイズはインデックス "M_ADSN_STRING_DATA_AD_DIG"
のための実装上の制約を超えて、私はFirebirdのFAQは、同様#213と#211、このSO questionをentrys読みます。 F_DIGITS
は、FreeAdhocUDFライブラリのUDFです。最初に、それは私の最大入力と出力の長さは唯一の320文字であるため
DECLARE EXTERNAL FUNCTION F_DIGITS
CSTRING(32760)
RETURNS CSTRING(32760) FREE_IT
ENTRY_POINT 'digits' MODULE_NAME 'FreeAdhocUDF';
として宣言された、私は、インデックスのサイズ要件に合うように
DECLARE EXTERNAL FUNCTION F_DIGITS
CSTRING(320)
RETURNS CSTRING(320) FREE_IT
ENTRY_POINT 'digits' MODULE_NAME 'FreeAdhocUDF';
にそれを変更しました。データベースのページサイズは16384
です。だから、私のキーは4096バイトまでであると思います。
列ATTRIBUTEDATA
のDMN_AFT_STRING
がなぜキーサイズを超えない
CREATE DOMAIN DMN_AFT_STRING AS
VARCHAR(320) CHARACTER SET ISO8859_1
NOT NULL
COLLATE DE_DE_CS_SF;
として宣言されているドメイン?
ええ、メタデータキャッシュはトランザクションにバインドされていることがあり、時にはそうではなく、スーパーサーバとクラシックで異なる場合もあります。一旦あなたがその機能を呼び出すと、それは「ウォームアップ」してしまいました。しかし....あなたの変更は容認できますか?実際の実装を変更することなく、関数のメモリバッファをスライスしました。私は....たぶん私はSQL /バイナリ境界ではなく、SQL領域でバッファを明示的にトリミングする 'cast(myfunction(x)as VarChar(320)) 'のインデックスを設定しようとします。 –
変更は大丈夫だと思います。私はUDFの実装方法を知っています。入力と出力の長さに関して完全に独立しています。 –