[英]Which NHibernate / SQL “Exists” query is more efficient (and how to know)?
我一直在為以下代碼片段分析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。
假定ID
是主鍵(或至少是唯一鍵),第二個查詢可能會稍微更高效,因為它只需要讀取USERS
表的ID
列上的索引。 第一個查詢將需要做同樣的工作才能讀取索引,但是隨后將不得不從表中獲取相應的數據。 如果查看兩個查詢計划,則應該看到第一個查詢對表做了額外的讀取。
另一方面,如果您正在搜索沒有唯一索引的列,則第二個查詢的效率較低,因為第二個查詢可能必須從索引中讀取多個塊或對表進行完整掃描才能獲取找到第一個查詢行后,第一個查詢就可以停止處理的計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.