2016-06-09 106 views
1

我在SSMS2008以下查询:查询速度在SQL Server Management Studio中(2008年)与NHibernate的session.Query

select * 
from Measurements 
where dt > '2016-01-01 04:00:00' 
    and dt < '2016-01-01 04:05:00' 
    and classification = 'heartbeat' 

我的表中有超过400万条记录在里面,心跳等数据(我知道),但上面的查询在不到1秒内执行(检索1500条记录)。 dt和分类列上有索引。

当我使用此查询NHibernate的:

var heartbeats = session.Query<Measurements>() 
         .Where(m.dt > dtFr && 
           m.dt < dtTo && 
           m.classification = 'heartbeat') 
         .ToList(); 

。然而,此查询失败。唯一不同的是(据我所见),是我使用DateTime对象(和dtTo并将它们传递给linq表达式。但是,当这个查询失败(超时),我可以复制+粘贴失败的查询到SSMS2008,它会在那里执行没有任何问题。

编辑:昨天我做了太多的测试,我把事情弄混了。这似乎是失败的查询不会运行(均不是从SSMS)。我看不出我做错了什么。

+0

那么现在的问题是什么?当你不知道自己在做什么时很难帮助你... –

回答

0

我可能会说,第一个选择是在sql服务器上处理。 (很明显,因为您已经使用Management Studio进行了测试)

我认为会发生什么是代码中的查询请求来自sql server的所有数据,然后它会在您的本地应用程序中执行搜索。

我可能是错的,因为我不知道linq如何处理where子句,但它听起来似乎可能是这种情况。

干杯

托马斯

1

有一个关于失踪的映射信息,这在目前看来是最可疑的。即在情况下,有相关的参考资料,一些不规范的取(不懒,这是默认的,其实是最好的)

要解决(或者避免)这样的问题,使用投影。这样,NHibernate的将加载和后处理只是必填字段

var heartbeats = session.Query<Measurements>() 
    .Where(m.dt > dtFr && 
     m.dt < dtTo && 
     m.classification = 'heartbeat') 
    .Select(x => new {m.dt, m.classification }) 
    .ToList(); 

换句话说,原始SQL和最后的处理与NHibernate的区别...通常物化。可以肯定的是,你在这里减少了...结果应该是一个直接的SQL执行速度很快

相关问题