哪个NHibernate / SQL“存在”查询更有效(以及如何知道)?

时间:2011-11-17 18:34:00

标签: .net sql oracle nhibernate database-performance

我一直在分析NHibernate为下面的代码片段生成的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 => user.Id == 1).Count() > 1;生成:

select 
    count(*)
from 
    users 
where 
    id = 1

哪个效率更高?将来,我该如何判断?我正在使用Oracle。

1 个答案:

答案 0 :(得分:0)

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

另一方面,如果您正在搜索没有唯一索引的列,则第二个查询的效率会降低,因为它可能必须从索引中读取多个块或对其进行全面扫描。第一个查询在找到第一个匹配行后可以停止处理的计数表。