DO's&DONT's #9: やらない方がいいこと - ディメンションのキー属性として末尾に全角スペースが格納される恐れがあるカラムを利用する。

小林 真治
SQL Developer Support Escalation Engineer

SQL Server 2005/2008/2008 R2 を利用した際に、ディメンションキーの末尾に全角スペースがあるために、以下の様なエラーでキューブ処理が失敗することがあります。

エラー
------
OLAP ストレージ エンジン エラー: 属性キーが見つかりません
------

これは、データ末尾に全角スペースが存在する/しない同一のデータが存在し(例えば、「リンゴ」、「リンゴ△」(△が全角スペース)といったデータを想定してください)、その データがディメンション属性のプロパティである KeyColumns カラムとして設定されている場合に、ディメンション処理時に Analysis Services 内部で実行される下記 2 つの各クエリをもとにしたスペースの取扱い方が異なる事に起因し発生します。

 a) ディメンションの属性キー取得のために発行されるソースデータベースへのクエリ
ソースデータベースより返された結果をもとに Analysis Services 内部では全角スペースが trim した形で扱われ、そのデータを元に Analysis Services はディメンションを作成します。

b) キューブ処理時にデータソースのファクト テーブルからレコード取得のために発行されるクエリ
データ末尾に全角スペースが存在するものと存在しないデータがそれぞれ Analysis Services に返されます。

上記の結果、 Analysis Services にてディメンション属性キーとメジャーのマッピングを行う際に、全角スペースを含む値は、全角スペースを含まない属性キーと異なるデータと判断されます。この動作に起因してデータが不一致となるために、エラーが発生しキューブ処理が失敗します。

この現象の対処策としては、下記の方法が一例として考えられます。

■Analysis Services のデータソース上のデータをクレンジングする。
こちらの対処策は Analysis Services のデータソース上のデータを作成する段階で全角スペースデータをクレンジングする方法となります。
末尾の全角スペースを取り除く、または、半角スペースにリプレースする方法があります。

■Analysis Services のディメンションの KeyColumns  として文字列ではなく数値型が格納されるカラムを利用するようにキューブの構造を変更する。
ディメンション属性の KeyColumns プロパティに文字列が格納されるカラムを指定している場合、その文字列カラムを Key とした Sort、Distinct が行われるため、エラーが発生する可能性があります。このため、 KeyColumns プロパティの値として、数値型が格納されるカラムを指定することでエラーを回避できます。
尚、この設定によりキューブ処理のパフォーマンス向上も見込まれます。