使用Nhibernate将Oracle日期映射到日期时间3.2
首先,描述我的问题的一个简单示例。使用Nhibernate将Oracle日期映射到日期时间3.2
型号
public class User
{
public virtual String UserID { get; set; }
public virtual String UserName { get; set; }
public virtual DateTime LastLoginTime { get; set; }
}
映射
<id name="UserID" type="AnsiString">
<column name="p_UserID_vc" length="20"></column>
<generator class="assigned"/>
</id>
<property name="UserName" column="UserName_vc" type="AnsiString">
<property name="LastLoginTime" column="LastLoginTime_d" type="DateTime">
表
create table T_User
(
p_userid_vc VARCHAR2(20) not null,
username_vc VARCHAR2(50),
lastlogintime_d DATE,
)
现在,有在这个表中的一个亿的用户。我在LastLoginTime中创建一个oracle索引。我用这样的查询:
var list = Responsity<User>.Where(q => q.LastLoginTime <= DateTime.Now &&
q.LastLoginTime >= DateTime.Now.AddDays(-7));
我使用NHibernate的个人资料WATCHOUT真正的SQL字符串:
select t.p_UserID_vc
from T_User t
where t.lastlogintime_d >= TIMESTAMP '2012-03-19 16:58:32.00' /* :p1 */
and t.lastlogintime_d <= TIMESTAMP '2012-03-26 16:58:32.00' /* :p2 */
它没有使用索引。我认为它应该使用'to_date',以便它可以使用索引。如何配置映射文件?
有几个原因,它可能不使用索引:
的
LastLoginTime
的数据类型是一个DATE
,但参数是TIMESTAMP
S,所以它可能列被隐式转换为时间戳,这意味着它不能使用索引。基于成本的优化器(CBO)可能使用的统计信息表明使用索引的效率会低于不使用它。例如,表中可能只有很少的行,或者直方图可能会告诉CBO,大量的行与您查询的日期范围相匹配。全表扫描超越使用索引的查询并不罕见。
也许表上的统计资料已经过时,导致CBO做出不准确的估计。
对您的查询做一个解释计划,以确定原因是什么。
注意:使用文字值的查询(例如TIMESTAMP '...'
)的计划可能与使用绑定变量的查询(例如p1
和p2
)的计划完全不同。为实际正在执行的查询运行解释计划。
您的第一个原因是正确的。LastLoginTime的DbType是DATE.I将DateTime发送到Nhibernate,但它将参数转换为TimeStamp.so,数据库无法使用索引。如何修改要发送的配置文件DateTime直接? – 2012-03-26 06:11:40
我不知道如何配置NHibernate,对不起,但你想要的是它使用'TO_DATE('2012-03-19 16:58:32','YYYY-MM-DD HH24:MI: SS')'... – 2012-03-28 03:05:09
终于,我发现了这篇文章的真正原因(https://forums.oracle.com/forums/thread.jspa?messageID=1659839)。它是通过发送带有DateTime类型参数的参数化查询引起的。将参数更改为TimeStamp而不是Date。因此,我发送Date类型参数。 – 2012-03-31 05:37:46
以防万一,如果有人还在寻找一个答案,希望这有助于 的解决方法是适当方言配置它,在我的情况下,它是NHibernate.Dialect.Oracle10gDialect
没有'LastLoginTime'在你的表格定义。它是什么类型? 'DATE'或'TIMESTAMP'? – 2012-03-26 04:33:36
对不起,我编辑过。 LastLoginTime的DBType是DATE.I认为Nhibernate会使用'to_date'而不是'TIMESTAMP',但它没有。 – 2012-03-26 05:56:06