【问题标题】:Which NHibernate / SQL "Exists" query is more efficient (and how to know)?哪个 NHibernate / SQL“存在”查询更有效(以及如何知道)?
【发布时间】:2011-11-17 18:34:00
【问题描述】:

我一直在分析 NHibernate 为以下 sn-ps 生成的 SQL 查询。我认为代码 #1 会更高效,但是,生成的 SQL 让我怀疑。

1) bool any = Query.Where(user => user.Id == 1).Any(); 生成:

select 
    *
from 
    users
where exists
        (select id
         from users
         where id = 1)
and rownum <= 1

2) bool any = Query.Where(user =&gt; user.Id == 1).Count() &gt; 1; 生成:

select 
    count(*)
from 
    users 
where 
    id = 1

哪个更有效率?将来,我将如何确定这一点?我正在使用 Oracle。

【问题讨论】:

    标签: .net sql oracle nhibernate database-performance


    【解决方案1】:

    假设ID 是主键(或至少是唯一的),第二个查询可能会稍微高效一些,因为它只需要读取USERS 表的ID 列上的索引。第一个查询将需要相同的工作来读取索引,但随后必须从表中获取相应的数据。如果您查看这两个查询计划,您应该会看到第一个查询对表进行了额外的读取。

    另一方面,如果您搜索的列上没有唯一索引,则第二个查询效率较低,因为它可能必须从索引中读取多个块或对表来获取计数,而第一个查询一旦找到第一个匹配行就可以停止处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2017-09-09
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多