当前位置:  -> 首页 -> NHibernate查询语句造成Oracle索引失效的问题

上一篇 | 下一篇
NHibernate查询语句造成Oracle索引失效的问题
作者:洛羽叶  点击率:3594  发布时间: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有问题),有空会解析清楚,反正问题解决了,噢噢噢噢噢!

 

标签: ORACLE NHIBERNATE .NET
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:0
今日访问:1
总访问量:1471139
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006