MS SQL Server、MySQL、および Oracle をサポートするアプリには、次の関連する列を含むテーブルがあります (ここに示されている型は Oracle のものです)。
ShortText VARCHAR2(1700) indexed
LongText CLOB
アプリは、850 文字以下の値を ShortText に格納し、それより長い値を LongText に格納します。そのデータがどの列にあるかに関係なく、そのデータを返すビューを作成する必要があります。これは、SQL Server と MySQL で機能します。
SELECT
CASE
WHEN ShortText IS NOT NULL THEN ShortText
ELSE LongText
END AS TheValue
FROM MyTable
ただし、Oracle では、次のエラーが生成されます。
ORA-00932: inconsistent datatypes: expected CHAR got CLOB
...つまり、Oracle は 2 つの列を暗黙的に同じ型に変換しないため、クエリで明示的に変換する必要があります。データが切り捨てられたくないので、使用する型は CLOB と同じ量のデータを保持できる必要があります。これは、(Oracle の専門家ではない) 私が理解しているように、CLOB のみを意味し、他に選択肢はありません。
これはOracleで機能します:
SELECT
CASE
WHEN ShortText IS NOT NULL THEN TO_CLOB(ShortText)
ELSE LongText
END AS TheValue
FROM MyTable
しかし、パフォーマンスは驚くほどひどいです。LongText を直接返すクエリでは、約 9,000 行で 70 ~ 80 ミリ秒かかりましたが、上記の構成では 30 ~ 60秒かかり、許容できません。
そう:
- CLOBと同じ量のデータを保持できる、両方の列を強制できる他のOracleタイプはありますか? 理想的には、MySQL の LONGTEXT や SQL Server の NTEXT (または NVARCHAR(MAX)) のような、よりテキスト指向のものでしょうか?
- 私が見るべき他のアプローチはありますか?
いくつかの詳細、特に @Guido Leenders によって要求されたもの:
Oracle バージョン: Oracle データベース 11g 11.2.0.1.0 64 ビット プロダクション 私が唯一のユーザーかどうかは定かではありませんが、相対的な時間は依然として印象的です. 以前に投稿したパフォーマンスを見た小さなテーブルの統計: 行数: 9,237 varchar 列の全長: 148,516 clob 列の全長: 227,020