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

どちらがより効率的ですか?将来、これをどのように判断しますか?Oracleを使用しています。

4

1 に答える 1

0

それが主キー (または少なくとも一意) であると仮定すると、テーブルの列のIDインデックスを読み取るだけでよいため、2 番目のクエリの方がわずかに効率的である可能性があります。最初のクエリは、インデックスを読み取るために同じ作業を行う必要がありますが、その後、テーブルから対応するデータをフェッチする必要があります。2 つのクエリ プランを見ると、最初のクエリがテーブルの余分な読み取りを行っていることがわかります。IDUSERS

一方、一意のインデックスを持たない列を検索していた場合、2 番目のクエリは、インデックスから複数のブロックを読み取ったり、取得するためにテーブルのフル スキャンを実行したりする必要があるため、効率が低下します最初の一致する行が見つかったら、最初のクエリが処理を停止できる間のカウント。

于 2011-11-17T18:43:01.280 に答える