2017-01-24 3 views
2

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バイトまでであると思います。

ATTRIBUTEDATADMN_AFT_STRINGがなぜキーサイズを超えない

CREATE DOMAIN DMN_AFT_STRING AS 
VARCHAR(320) CHARACTER SET ISO8859_1 
NOT NULL 
COLLATE DE_DE_CS_SF; 

として宣言されているドメイン?

答えて

1

短い話題:あなたはそれをもう一度オフにしようとしましたか?

は、UDF宣言を変更して式インデックスを追加する前に切断して接続してください。のように見えます。

これで正常に動作します。キーのサイズはもはや超過しません。

+0

ええ、メタデータキャッシュはトランザクションにバインドされていることがあり、時にはそうではなく、スーパーサーバとクラシックで異なる場合もあります。一旦あなたがその機能を呼び出すと、それは「ウォームアップ」してしまいました。しかし....あなたの変更は容認できますか?実際の実装を変更することなく、関数のメモリバッファをスライスしました。私は....たぶん私はSQL /バイナリ境界ではなく、SQL領域でバッファを明示的にトリミングする 'cast(myfunction(x)as VarChar(320)) 'のインデックスを設定しようとします。 –

+0

変更は大丈夫だと思います。私はUDFの実装方法を知っています。入力と出力の長さに関して完全に独立しています。 –

関連する問題