0

結果を ID で並べ替えました:

    CREATE TABLE my_table2 AS SELECT * FROM my_table ORDER BY record_group_id;

今私が実行すると:

    SELECT DISTINCT record_group_id  FROM my_table2 where rownum <=1000000; 

gorup id はランダムな順序で取得されますが、順序は問題ありませんでした: 結果セットのレコードの一部を次に示します。

1599890050
1647717203
1647717120
1647717172
1647716972
1647717196
1647717197
1647717205
1599889999
1599889986

考えられる理由は何ですか?DISTINCT ステートメントは、テーブルにあるのと同じ順序でレコードを返すべきではありませんか?

4

5 に答える 5

4

どちらもSELECT、またはDISTINCTデータの順序を定義しません。

順序付けられたデータが必要な場合は、必要なを明示的に定義しOrderます。

SELECT DISTINCT record_group_id 
FROM my_table2 
WHERE rownum <=1000000 
ORDER BY record_group_id; 
于 2013-10-18T13:37:49.283 に答える
3

順序付けは、テーブルに挿入されるソース データの順序のみを決定します。テーブルにクラスター化インデックスがない場合は、レコードがその順序で物理的に格納されることを意味します。

ただし、レコードの保存方法は、その順序で選択されることを保証するものではありません。実行プランナーは、クエリを実行する最も効率的な方法を決定します。つまり、データが思い通りにフェッチされない可能性があり、データが変更されたり、データに関する統計が変化したりすると、時々異なる可能性があります。 .

例のような単純なクエリの場合、通常は予測可能な結果が得られますが、保証はありません。そのため、予測可能な結果が確実に得られるように、データをフェッチするクエリを常に並べ替える必要があります。

この場合、データがテーブルに格納されている順序で取得されない理由の 1 つは、結果のフィルター処理にインデックスが使用され、レコードがインデックス順ではなくインデックス順に返されることが考えられます。テーブルの順番。

于 2013-10-18T13:43:20.007 に答える
1

SELECT ステートメントで ORDER BY を使用します。

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <=1000000
ORDER BY record_group_id;
于 2013-10-18T13:39:10.190 に答える
1

usingDISTINCTは順序には影響せず、値の一意性のみに影響します。

順序も制御したい場合:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <= 1000000
ORDER BY record_group_id -- Added this line
于 2013-10-18T13:39:57.890 に答える
0

テーブル内のデータが順序付けられているという仮定は間違っています。データベース テーブルには暗黙的な順序付けはありません。並べ替えられていないデータの袋にすぎません。

順序付けされたデータが必要な場合は、ORDER BY を使用する必要があります。これを回避する方法はありません (DISTINCT も GROUP BY も ... もありません) 。Order By に関する TomKyte ブログを参照してください。

于 2013-10-18T13:53:39.147 に答える