我有一个大约 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 设置会以某种方式混淆优化器,因为 id 不是 nchar?在几乎所有查询上添加提示或重新定义所有键都是相当尴尬的。
或者,全表扫描是否被视为微不足道,因为将要加载“大” nclob - 该假设似乎偏离了 3 个数量级,我想相信 Oracle 比这更聪明。
还是只是运气不好?或者是其他东西?是否可以在没有提示的情况下修复?