|
|
NHibernate查询语句造成Oracle索引失效的问题 |
作者:洛羽叶 点击率:3792 发布时间:2009-04-10 |
环境
Visual Studio .NET 2005、NHibernate 2.0 GA、Oracle10g企业版
问题
有一个表:
Create table t1(code varchar2(100),name varchar2(100));
Code上有索引
项目中使用了NHibernate,有此有个4000多万记录的表做查询,由于和其它上亿记录的表做left join速度很慢,所以要做索引及语句优化,当所有的复合查询优化完毕后,发现了一个问题,当用以下
Expression.Eq("f1", ‘abc’)
时发现Oracle缓冲池中的sql总是用不上f1的索引:
Select * from t1 where f1=:1
以上语句比较简单,实际中有几个大表关联,通过/*+(t1 idx_t1_1)*/等都不起作用,开始怀疑是语句表太多太过复杂的原因,但换成单表查询也是一样的问题,后来查询NHibernate的日志,但日志中也没有什么特别的,因为绑定变量也看不出什么,在映射文件强制声明了实体属性类型及数据库字段类型问题依旧,最后怀疑是不是NHibernate自身的原因造成的,根据我对Oracle的了解一定是数据类型转换造成索引失效,因此将条件改为:
Expression.Sql("f1=to_char(?)", ‘abc’, NHibernate.NHibernateUtil.String)
再次检查sql缓冲池索引用上了,果然是数据类型的原因,但这样的问题在几十万记录的表里不会出现性能所以很少会发现,具体原因应该是NHibernate使用Command的Parameter参数时设置不合理造成的(但也不能说NHibernate有问题),有空会解析清楚,反正问题解决了,噢噢噢噢噢!
|
|
|
|
|