2011-11-17 60 views
0

我一直在分析NHibernate为下面的代码片段生成的SQL查询。我认为代码#1会更有效率,但是,生成的SQL让我怀疑。哪个NHibernate/SQL“Exists”查询更高效(以及如何知道)?

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

假设ID是主键(或者至少是唯一的),所述第二查询可能稍微更有效,因为它仅需要读取在USERS表的ID列的索引。第一个查询需要进行相同的工作来读取索引,但是必须从表中获取相应的数据。如果您查看两个查询计划,您应该看到第一个查询会对表进行额外读取。另一方面,如果您在其上没有唯一索引的列上进行搜索,则第二个查询的效率会降低,因为它可能必须从索引中读取多个块或对其进行全面扫描该表获取计数,而第一个查询可以在找到第一个匹配行后停止处理。