0

我一直在分析 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

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

4

1 回答 1

0

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

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

于 2011-11-17T18:43:01.280 回答