-1

これはインタビューの質問でした。質問が言うように、インタビュアーは基本的に、データベースから 10 個のランダムなレコードを取得するように私に求めました。n 個のレコードがあることがわかっている場合は簡単に見えます。しかし、私の場合。レコード数を検索することはできません。

これを行う効率的な方法は何ですか?

4

2 に答える 2

4
SELECT * FROM table ORDER BY RAND() LIMIT 10
于 2013-10-22T16:43:55.733 に答える
2

これは基本的にSQL Server Random Sortの複製のようです。これは基本的にHow to request a random row in SQL?の複製です。.

後者には、この投稿を参照する複数の RDBMS に対する包括的な回答があります。

データベース テーブルからランダムな行を選択する SQL

Microsoft SQL Server の答えは次のようになります。

SELECT TOP 10 * FROM テーブル ORDER BY NEWID();

これは、大きなテーブルではうまく機能しません。テーブル全体をスキャンし、行ごとに一意の番号 (16 ビットの GUID) を生成してから、その一意の番号で結果を並べ替えます。

SQL Server で RAND() による単純な順序付けでは、レコードのランダム リストは作成されません。RAND() はステートメントの先頭で 1 回評価されるため、実際にはまったく順序付けされていない定数によって効果的に順序付けされます。ORDER BY を使用しなくても同じ結果が得られます。実際、SQL Server 2005 の私のインスタンスでは、クエリ プランと結果は、ORDER BY RAND() の有無にかかわらず同じでした。

SQL Server の RAND() はシード値を取るため、さまざまなテーブル列の値を RAND 関数に渡してランダムな結果を取得できると考えるかもしれません。ある意味、できます。IDENTITY またはその他の一意の列を RAND 関数に渡すことができますが、そうでない場合と同じ順序は得られません。そして、偶然の観察者にはそう見えるという意味で、順序はランダムになります。しかし、それは繰り返し可能です。SQL Server の RAND() 関数は、同じ接続の同じシードに対して常に同じ値を返します。

「1 つの接続で、指定されたシード値で RAND() が呼び出されると、それ以降の RAND() のすべての呼び出しは、シードされた RAND() 呼び出しに基づいて結果を生成します。」

http://technet.microsoft.com/en-us/library/ms177610.aspx

そのため、ランダムなリストのように見えますが、同じ接続で複数回実行すると、同じリストが得られます。要件によっては、それで十分な場合があります。

小さなテーブルでの限定的なテストに基づくと、一意の列シードを使用した RAND は、推定クエリ コストがわずかに低くなりました。

于 2013-10-22T16:59:04.473 に答える