У меня есть таблица с примерно 100.000 строк, которая выглядела примерно так:
id varchar(20),
omg varchar(10),
ponies varchar(3000)
При добавлении поддержки международных символов нам пришлось переопределить столбец ponies
в nclob, так как 3000 (многобайтовых) символов слишком велики для nvarchar
id varchar(20),
omg varchar(10),
ponies nclob
Мы читаем из таблицы, используя подготовленный оператор в Java:
select omg, ponies from tbl where id = ?
После того, как столбец «ponies» был изменен на NCLOB и некоторые другие таблицы, в которых были изменены столбцы nchar, Oracle 11g решил выполнить полное сканирование таблицы вместо использования индекса для столбца id
, что вызывает наше приложение остановиться.
При добавлении подсказки к запросу используется индекс, и все «хорошо», точнее, чуть медленнее, чем это было, когда столбец был varchar.
Мы определили следующие свойства соединения:
oracle.jdbc.convertNcharLiterals="true"
defaultNChar=true
Кстати, статистика базы данных обновляется.
У меня не было времени просмотреть все запросы, поэтому я не знаю, игнорируются ли другие индексы, но нужно ли беспокоиться о том, что настройка defaultNChar как-то сбивает с толку оптимизатор, поскольку идентификатор не является nchar? Было бы довольно неловко либо добавлять подсказки практически ко всем запросам, либо переопределять все ключи.
В качестве альтернативы, будет ли загружаться полное сканирование таблицы, считающееся незначительным, поскольку "большой" nclob будет загружен - это предположение, кажется, отклонено на 3 порядка, и я хотел бы полагать, что Oracle умнее этого.
Или это просто невезение? Или что-то другое? Можно ли исправить без подсказок?