SSMSが新しい行を下ではなく表の上部に挿入するのはなぜですか?


14

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彼らができることを知っていますが、なぜこれが起こっているのですか?私のデータのほとんどはWebアプリケーションを介して挿入され、このアプリケーションからのすべての挿入は、先入れ先出しの順序になります。たとえば、最新の挿入は下にあるため、IDはすべて連続しています。サーバーまたはManagement Studioに、この不適切な順序付けを引き起こす設定がありますか?


時々見たように、単一のテーブルを選択した場合、行の表示方法はPKの順序に依存します。あなたには、いくつかの結合させる場合、それは他のテーブルPKさん、FKのインデックス...に応じて変更することができます
ギジェルモ・グティエレス

メリーゴーランドスキャンにも注意してください。
マイケルグリーン

回答:


21

SQLの世界では、順序は一連のデータに固有のプロパティではありません。したがって、ORDER BY節を使用してデータを照会しない限り、RDBMSからデータが特定の順序で、または一貫した順序で返されるという保証はありません。

クレイグ・フリードマンから:

TOPとORDER BYを組み合わせると、返される行のセットに決定性が追加されます。ORDER BYを使用しない場合、返される行のセットはクエリプランに依存し、実行ごとに異なる場合があります。

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


13

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

言い換えれば、あなたはすでに答えを知っていることを知っていますが、それは十分に述べることができません:

クエリの順序に依存したい場合は、常に追加し ORDER BYます。


注文に依存するつもりはありませんでしたが、視覚的には、最後に挿入したアイテムが突然最上部にあるのは少し面倒です。
ベンブロッカ

これは、Open Tableを使用しているためだと思います。Management Studio 2008では、このコマンドは「上位n行の編集」と「上位N行の選択」に分かれています。後者を選択すると、結果のクエリを自由に編集できます。
アーロンバートランド

サーバーは2005年であるManagement Studio 2008です。「テーブルを開く」コマンドがあることは知りませんでしたが、私は常にselect文を使用してきました
ベンブロッカ

4
[OK]を、よくまだ私はそれはデータがあなたが期待していないために戻ってくることを迷惑なんだ理解し、私はSQL Serverが本当にあなたが期待する注文何を気にしない、なぜそれが今明らかだ願って、立っているポイントがない限り、あなたが気にしていること、それを伝えます句による順序を追加します。:-)
アーロンバートランド

1

これは、テーブルがヒープテーブル(ほとんどの場合)であり、インデックスが付けられていないためです。ID列をa PRIMARY KEYと同様にしIDENTITYます。SQL Serverはインデックスに基づいてデータを物理的に保存します-たとえば、idがクラスター化インデックス(プライマリキーなど)の場合、データはidの順序で物理的に保存され、クエリがなくてもクエリで返されますORDER BY句。それ以外の場合、行の順序はデータベースにとってまったく重要ではありません。したがって、アプリケーションをデータベース内の行の順序に依存させること(および特定の順序にある​​列に依存させること)は良い習慣ではありません。アプリケーションは、行を識別するためにデータベースにあるキーと連携する必要があります。


知っておくといい。これは使用するアプリを変更するためのヒントであることは知っていました(これはorder by継承されたアプリであり、多くの悪い習慣があります)。
ベンブロッカ

5
SELECT *せずに「正しい」順序で戻ってくるORDER BY 可能性があるようにテーブルの構造を変更します(ただし、まだ保証されていません)。
アーロンバートランド

クラスター化インデックスを持つテーブルからの単純なSELECTでは、クラスター化インデックスの順序で戻ります。データが特定の列によって物理的に順序付けられていることを示すものであるということは、私が思ったほど明確ではありませんでしたが、すべてのクエリで正しく返されることは間違いありません。ミー・カルパ。
ウィル

5
クラスタ化インデックスが何であるかは実際には関係ありません。SQL Serverは、さまざまな要因に基づく他のインデックスに基づいて順序を返す場合があります。一部の列で主キーを作成しても、順序が指定されていない選択が突然その列の順序で突然戻されることを保証しません。あなたはほとんどの時間を観察しましたか?承知しました。しかし、それは保証と同じではありません。私は自分の路上でホッキョクグマを見たことはありませんが、ホッキョクグマの力場がそれを防ぐことはありません。
アーロンバートランド

4
とにかく私のポイントは、追加ということでしたORDER BY句は、テーブルにスキーマ変更を行うとよりもはるかに良い保証(はるかに少ない混乱を気にしない)であることを望んあなたは永遠に、期待どおりの順序付けがされること。
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.