ARRAY/VARRAY型列で見つかることがある問題として、UTF8文字データを処理する場合に発生する予期しない行の長さエラーがあります。この問題は、ARRAY/VARRAY型がCHARACTER要素タイプまたはVARCHAR要素タイプで定義されている場合にのみ発生します。例えば、ARRAYデータ型列を含むテーブルarrayc4を作成するとします。UTF-8クライアント セッション文字セットからインポートされたデータを含むテーブルに、データを挿入します。これらの行をテーブルに挿入する時点では問題は発生しません。しかし、UTF-8セッション文字セットを再び使用して行全体を選択しようとすると、Teradata Databaseは以下のエラーを返します。
SELECT * FROM arrayc4; *** Failure 3577 Row size or Sort Key size overflow. Statement# 1, Info =0 *** Total elapsed time was 1 second.
このエラーは、常に発生するわけではありません。エラーが発生するかどうかは、配列の大きさや、必要とされる内部ストレージの大きさに応じて決まります。
これによる影響を要約すると、テーブルを作成し、データをテーブルに挿入することはできますが、テーブル内のすべての列をクライアント システムにエクスポートしようとしたときに、FastExportなどのクライアント ユーティリティが失敗するということです。
同様の問題は、文字データと非文字データの両方を使用したTeradata Databaseのその他の状況で発生することがあります。これは、UTF-8文字データに限定されていません。
以下の項目は、この問題を処理する場合に考えられる回避策のいくつかを示しています。
- この問題が発生しているユーザーのデフォルトのエクスポート幅を変更することができます。新規のエクスポート幅は、データをクライアントにエクスポートするときに、そのサーバー ストレージ サイズから行サイズが増えるものであってはなりません。
この回避策において考えられる問題は、エクスポート幅が各配列要素に個々に適用されるため、縮小する他のエレメントが存在する場合でも、全体の行サイズが正しくなるように、拡張を必要とする要素が切り捨てられる可能性があるということです。
- 文字列データの問題に対処する2つの方法があります。
- リクエストによって生成される列の数を減らす。
これには、Teradata Databaseが内部で生成し、ユーザーには返されない列の数を減らしたり、除外したりすることが含まれます。一例として、システムがBYNETソート キーを追加するデータ行があります。Teradata Databaseはソート キーを行に物理的に追加し、スプールに存在する一時列を生成しますが、システムがソートされたデータをリクエスト側に返すと、そのソート キーは行に追加されなくなります。
BYNETソート キーを、行の長さエラーが発生する原因となる行に追加する場合、文字列のすべての文字によるソートではなく、文字列の最初のn文字によるソートを試行できます。これは、配列の変換された形式であるVARCHARに適用されます。
- 生成中の列の一部またはすべてのサイズを減らす。
これが可能かどうかは、物理データベース設計が論理設計にどれほど厳密に従う必要があるかに依存します。これまでの経験から、より小さいデータ型(INTEGERの代わりのSMALLINTなど)あるいはより狭い文字データ型の幅を使用できると判断した場合、それを使用して行サイズ エラーを削減または除外できるかどうか試します。
- リクエストによって生成される列の数を減らす。
- 非文字データの場合、行サイズ エラーにとっての最適なソリューションは、予期しない行サイズ エラーの問題が発生しているクエリーによって返される列の数を減らすことです。
データベース スキーマの詳細が分からない場合、この問題に対してこれよりさらに明示的な回避策を提案することは不可能です。