SSMSがテーブルの最下部に新しい行を挿入するのはなぜですか?


9

SQL Server Management Studio 2008のテーブルに行を手動で挿入すると(データベースがSQL Server 2005の場合)、新しい行が下部ではなくリストの上部に表示されます。私はID列を使用しており、結果は次のようになります。

id row 
42 first row 
1 second row 
2 third row 

行がフェッチされ、明示的に順序付けされていない場合。これにより、Webアプリケーション用に行がフェッチされ、TOP 1クエリが返す内容が変更されたときの外観が異なります。

私はorder byのことがわかりますが、なぜこのようなことが起こっていますか?私のデータの大部分はウェブアプリケーションを通して挿入され、このアプリケーションからの全てのインサートは先入れ先出し注文になります。最新のインサートが一番下にあるので、IDはすべて一列に並んでいます。この不適切な注文の原因となるサーバーまたはManagement Studioの設定がありますか?

  0

1つの表を選択すると、時々見られるように、行の表示順序をPKの順序に依存します。いくつかの結合を行う場合、それは他のテーブルのPK、FK、およびインデックスに応じて変更することができます... 18 7月. 132013-07-18 22:00:36

  0

[merry-go-round](http://technet.microsoft.com/en-us/library/)に注意してください。 ms191475%28v = sql.105%29.aspx)もスキャンします。 01 4月. 152015-04-01 03:49:03

17

SQL世界では、注文はデータセットの固有のプロパティではありません。したがって、ORDER BY句を使用してデータを照会しない限り、RDBMSからデータが特定の順序で(または一貫した順序で)返される保証はありません。 Craig Freedmanから

BY ORDERでTOPを組み合わせることが が返される行のセットに決定論を追加します。 ORDER BYがなければ、返される行のセットは問合せプランの に依存し、実行ごとに異なる場合もあります。

結果セットで明確で一貫した順序が予想される場合は、常にORDER BYを使用してください。クエリでデータの特定の順序を保証するために、データベースにディスク上の行を格納する方法(クラスタ化インデックスなど)に決して依存しないでください。


0

テーブルがヒープテーブル(ほとんどの場合)でインデックスに登録されていないためです。 ID列をPRIMARY KEYとし、IDENTITYとします。 SQL Serverはインデックスに基づいてデータを物理的に格納します。たとえば、IDがクラスタ化インデックス(プライマリキーなど)の場合、IDの順に物理的に格納され、 ORDER BY節。それ以外の場合、行の順序はデータベースにとってまったく重要ではありません。したがって、データベース内の行の順番(および特定の順序にある​​列に応じて)には、に依存しています。アプリケーションは、行を識別するためにデータベースにあるどのようなキーでも動作する必要があります。

  0

お役立ち情報私はこれがアプリを 'order by'を使うように変更するヒントであることを知っていました(これは大変悪い習慣を持つ継承されたアプリです)が、なぜそれが起こったのかがちょっと疑問でした。 14 9月. 112011-09-14 19:49:38

+4

テーブルの構造を変更して、 'ORDER BY' ***を持たない' SELECT * 'が***正しい順序で戻ることができるようにします(それでも保証はできません)? 14 9月. 112011-09-14 20:22:26

  0

クラスタ化インデックスを持つテーブルからの単純なSELECTでは、クラスタ化インデックスの順に戻ります。データが特定の列によって物理的に順序付けされるときを例示したものですが、必ずしもすべてのクエリで正しく返されるわけではありません。 Mea culpa。 14 9月. 112011-09-14 20:27:39

+4

クラスタ化インデックスが何であるかは実際問題ではありません。 SQL Serverは、さまざまな要因に基づいて他のインデックスに基づいて注文を返すことがあります。いくつかの列にプライマリキーを作成する***は何もしません。あなたはほとんどの時間を観察することがありますか?確かに。しかしそれは保証と同じではありません。私は私の通りには、北極熊を見たことがないが、それが起こることを防ぐ北極熊力場はありません。 14 9月. 112011-09-14 20:41:09

+3

とにかく私の主張は、 'ORDER BY'節を追加することは、テーブルにスキーマを変更し、いつでも期待どおりになることを期待しているよりはるかに良い保証です。 14 9月. 112011-09-14 20:42:25


10

他の答えを増やすには:表は定義上、順序付けられていない行セットです。 ORDER BY句を指定しないと、SQL Serverは最も効率的と思われる順序で行を返すことができます。ほとんどのテーブルは、アイデンティティ、日時または他の単調増加列にクラスター化されたインデックスを持っているため、挿入の順序と一致することがよくありますが、偶然と同じように扱う必要があります。新しいデータ、統計更新、トレースフラグ、maxdopの変更、クエリヒント、クエリのjoinまたはwhere句の変更、サービスパック/累積的な更新プログラム/修正プログラム/アップグレードのためのオプティマイザの変更、データベースを別のサーバーに移動するなど言い換えれば

、と私はあなたがすでに答えを知っている知っているが、それは十分に記述することはできません。

クエリの順序に依存する場合、常にを追加ORDER BY

  0

私は順序に依存しないことを計画していましたが、視覚的には、最後に挿入したアイテムが突然上に来るのが面倒です。 14 9月. 112011-09-14 20:18:15

  0

オープンテーブルを使用しているからです。 Management Studio 2008では、このコマンドは「上位n行の編集」と「上位N行の選択」に分かれています。後者を選択すると、結果のクエリを自由に編集できます。トップを取り除き、注文を追加します。 14 9月. 112011-09-14 20:21:07

  0

それは管理スタジオ2008年、サーバーは2005年ですが、はっきりしているはずです。私は "オープンテーブル"コマンドがあることを知らなかった、私はいつも 'select'ステートメントを使用してきた。 14 9月. 112011-09-14 20:36:30

+4

あなたが期待していない順序でデータが戻ってきて、 order by節を追加して気にしない限り、SQL Serverがあなたが期待する順序を本当に気にかけていないのは明らかです。 :-) 14 9月. 112011-09-14 20:37:35