我一直在分析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。
答案 0 :(得分:0)
假设ID
是主键(或至少是唯一的),第二个查询可能稍微有点效率,因为它只需要读取{{1} ID
列上的索引表。第一个查询需要同样的工作来读取索引,但是必须从表中获取相应的数据。如果查看这两个查询计划,您应该看到第一个查询执行了对表的额外读取。
另一方面,如果您正在搜索没有唯一索引的列,则第二个查询的效率会降低,因为它可能必须从索引中读取多个块或对其进行全面扫描。第一个查询在找到第一个匹配行后可以停止处理的计数表。