Androidでは、sqliteデータベースに90,000を超えるレコードがあり、4つの異なるランダム行をフェッチしたいのですが、非常に時間がかかっています。私の携帯電話で6秒
クエリは以下です
select * from Employee RANDOM LIMIT 4
Androidでは、sqliteデータベースに90,000を超えるレコードがあり、4つの異なるランダム行をフェッチしたいのですが、非常に時間がかかっています。私の携帯電話で6秒
クエリは以下です
select * from Employee RANDOM LIMIT 4
まず、クエリは実際にはランダムな行をフェッチしません。最初の 4 行をフェッチします。これは、次のように解釈されるためです。つまり、「RANDOM」がテーブル エイリアスとして使用されます。
select * from Employee as RANDOM LIMIT 4
セットをランダムに並べ替えるには、次ORDER BY RANDOM()
のように を使用する必要があります。
SELECT * FROM Employee ORDER BY RANDOM() LIMIT 4
RANDOM()
ただし、これは (ご覧のとおり) 効率的ではありません。戻り値が予測できないため、最適化できないからです。
ランダムな Employee レコードをより速く取得するには、必要です
_id
)、およびPRIMARY KEY
列に対して自動的に行われます)。4 つのランダム レコードを取得するには、まず_id
データベースから最大値を取得します。
SELECT MAX(_id) FROM Employee
次に、コードで 1 とその値の間の 4 つのランダムな整数を生成し、次の高速なクエリを実行します。
SELECT * FROM Employee WHERE _id IN (?,?,?,?)
従業員を削除できる場合_id
、テーブルに値が存在しない可能性があります。その場合、新しい乱数を作成し、別のレコードで再試行する必要があります。