2016-12-22 1 views
0

のうち100を照会HQL:ランダムに私はHQLクエリー次きて10000のレコード

Query q = session.createQuery 
("Select j.salaryStartRange From Job j where region like (:region) and 
uniquejobid in (:ujIds) and j.salaryStartRange > 10000 
and (:degreeName) in elements(j.areasOfStudy) order by rand()"); 
    q.setParameterList("ujIds", ujIds); 
    q.setParameter("region", region); 
    q.setParameter("degreeName", degreeName); 

クエリ時間は、私が使用しているかどうかに関係なく同じではないようです:

List<Integer> result = q.setFirstResult(0).setMaxResults(100).list(); 

または

List<Integer> result = q.list(); 

つまり、可能な結果の完全なクエリは両方のクエリで実行されます。 maxResultsの制限は、クエリが完了した後にのみ設定されるようです。 私は100個のレコードをランダムに選択して検索したいだけです(何千ものレコードの中から)。このようなクエリを作成するにはどうすればよいですか?

合計: 10000レコードのうち100レコードをできるだけ効率的にランダムにクエリするにはどうすればよいですか?

+0

ここに違いが見られない理由はたくさんあります。どのデータベース、方言、およびドライバを使用していますか? – Naros

+0

postgressql; c3p0接続プール。 org.postgresql.Driver; org.hibernate.dialect.PostgreSQLDialect 両方のアプローチが実際に無制限の完全クエリを実行することを修正しましたか? – Jake

答えて

1

PostgreSQLがORDER BY RAND()を処理するには、問題の行をランダムに選択するためにデータベース自体がすべての行をフェッチする必要があります。小さなサイズのテーブルでは、おそらくスピードの問題に気づくことはありませんが、大きなテーブルではそれが実現します。

私はテーブルに億行を挿入し、次のクエリを発行した場合:

SELECT id, data FROM MyTable ORDER BY RANDOM() LIMIT 10 

この特定のクエリでは、唯一の10行を返すために、プロセスに秒数を取ります。あなたが説明計画を調べるならば、Sortコストは1億行になります。

あなたはthis投稿で解決策を見つけることができます。

+0

私が望んでいた答えではありませんでした(しかし...)しかし、それでも有益な答えです。ありがとう – Jake