【问题标题】:Query speed in SQL Server Management Studio (2008) vs NHibernate session.QuerySQL Server Management Studio (2008) 与 NHibernate session.Query 中的查询速度
【发布时间】:2016-06-09 06:12:00
【问题描述】:

我在 SSMS2008 中有以下查询:

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

我的表中有超过 4 亿条记录、心跳和其他数据(我知道),但上面的查询在不到 1 秒的时间内执行 (检索大约 1500 条记录)。 dt 和分类列都有索引。

当我在 NHibernate 中使用这个查询时:

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

.. 但是,此查询失败。唯一不同的(据我所知),是我使用 DateTime 对象dtFrdtTo 并将它们传递给 linq表达。但是,当此查询失败(超时)时,我可以将失败的查询复制并粘贴到 SSMS2008,它会在那里执行而不会出现任何问题。

编辑:昨天我做了太多的测试,结果搞混了。似乎失败的查询没有运行(既不是来自 SSMS)。我看不出我做错了什么。

【问题讨论】:

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

标签: c# sql-server performance linq nhibernate


【解决方案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 执行一样快

【讨论】:

    【解决方案2】:

    我可能会说第一个选择是在 sql server 上处理的。 (显然您已经使用 Management Studio 对其进行了测试)

    我认为发生的情况是代码中的查询从 sql server 请求所有数据,然后在您的本地应用程序中进行搜索。

    我可能错了,因为我不知道 linq 是如何处理 where 子句的,但在我看来,这可能就是这种情况。

    干杯

    托马斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      相关资源
      最近更新 更多