2011-11-17 100 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列的索引。第一個查詢需要進行相同的工作來讀取索引,但是必須從表中獲取相應的數據。如果您查看兩個查詢計劃,您應該看到第一個查詢會對錶進行額外讀取。另一方面,如果您在其上沒有唯一索引的列上進行搜索,則第二個查詢的效率會降低,因爲它可能必須從索引中讀取多個塊或對其進行全面掃描該表獲取計數,而第一個查詢可以在找到第一個匹配行後停止處理。