4

アイテムがテーブルに挿入され、次に などのクエリを作成したselect * from table場合、結果が期待どおりの順序にならないのはなぜですか?

4

2 に答える 2

11

クエリの順序は、ステートメントで「Order by」句を使用して強制できます。SQL Database は実際には、データを配置する順序や特定の順序でデータを格納する順序を理解していません。これは、項目の順序を SQL に伝える必要があることを意味します。たとえば、次のようになります。

Select * from Table
  order by column1 desc

Think about it like handing some stuff to your friend to hold - she will have all of it for you later, but she stores it someplace in the mean time. She may move it around while you are not looking to make room for something else, or may hand it back in the same order you gave it to her, but you didn't tell her to keep it in order, so she doesn't.

Databases need to be able to move things around in the background, so the way they are built does not intrinsically know about any order - you need to know the order when you give it to the database, so that you can put it back in the order you want later. The order clause allows SQL to impose an order on the data, but it doesn't remember or have one on its own.

重要なポイント: SQL が、order by ステートメントを使用せずに正しい順序でアイテムを返したとしても、最後の 100 万回がそうであることを保証するものではありません。テーブルにクラスター化インデックスが存在する場合でも、期待どおりの順序で結果が返されるとは限りません。特に SQL バージョンが変更された場合、order by 句を明示的に使用しないと、クエリが必要な順序になると想定しているプログラムが壊れる可能性があります。

于 2012-06-12T15:32:26.190 に答える
2

挿入された順序で結果を期待するのはよくある誤解です。クラスタ化インデックスが使用されている場合でも、結果セットが期待どおりにならない場合があります。順序を強制する唯一の方法は、「order by」句を使用することです。順序が予想と異なる理由はさまざまです。クエリが並行して実行され、結果セットがマージされる可能性があります。または、結果セットをできるだけ早く返そうとする際のクエリ最適化プランが原因である可能性があります。

于 2012-06-12T15:46:19.027 に答える