В приложении, которое поддерживает 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 не будет неявно преобразовывать два столбца в один и тот же тип, поэтому запрос должен делать это явно. Не хочу, чтобы данные усекались, поэтому используемый тип должен содержать столько же данных, сколько CLOB, что, как я понимаю (не эксперт Oracle), означает только CLOB, других вариантов нет.
Это работает на Oracle:
SELECT
CASE
WHEN ShortText IS NOT NULL THEN TO_CLOB(ShortText)
ELSE LongText
END AS TheValue
FROM MyTable
Тем не менее, производительность удивительно ужасна. Запрос, возвращающий LongText напрямую, занял 70-80 мс для примерно 9 000 строк, но приведенная выше конструкция заняла от 30 до 60 секунд, что неприемлемо.
So:
- Существуют ли какие-либо другие типы Oracle, к которым я мог бы принудить оба столбца, которые могут содержать столько же данных, сколько CLOB? В идеале что-то более текстовое, например LONGTEXT в MySQL или NTEXT в SQL Server (или, что еще лучше, NVARCHAR(MAX))?
- Любые другие подходы, на которые я должен обратить внимание?
Некоторые особенности, в частности те, которые запросил @Guido Leenders:
Oracle version: Oracle Database 11g 11.2.0.1.0 64bit Production Not certain if I was the only user, but the relative times are still striking. Stats for the small table where I saw the performance I posted earlier: rowcount: 9,237 varchar column total length: 148,516 clob column total length: 227,020