1

sqlconnection で実行するクエリがあり、SqlCommand.ExecuteReader からリーダーを作成します。テーブルから単純な Select * を実行しています。私は順序付けを使用していませんが、管理スタジオで実行すると、クエリの結果は常に同じ順序で返されます。1 2 3 4 しかし、reader.Read() を実行すると、順序が異なります。ランダムなレコードが引き出されているのがわかります。3 2 4 1 なぜこのようなことが起こるのか、わかる人はいますか?

4

1 に答える 1

4

ORDER BY と言わなければ、ADO.NET は任意の順序で自由に行を返すことができます。なぜあなたは不平を言うのですか?

多くの場合、ORDER BY がなければ行の順序はクラスター化されたインデックスになると誤って想定します... または、GROUP BY を使用すると、この順序になります... またはその他の任意のルールです。

これらの仮定は、実装の詳細と特定の実行計画に常に依存している場合もあれば、そうでない場合もあります。

結果の順序を保証する唯一の方法は、ORDER BY を使用することです。他に何か問題があるか、順序を気にしません。

ところで、これは必ずしも並べ替えのパフォーマンス ヒットを意味するわけではありません。SQL Server は非常に巧妙で、行が既に並べ替えられていることがわかっている場合 (たとえば、ORDER BY 列に基づいてインデックスから読み取るため)、何もしません。

于 2013-06-20T16:21:44.350 に答える