sql server - 複数 - Order By節のないSQL Select文の順序




view order by 使えない (3)

私が知っているように、リレーショナルデータベース理論から、 order by節のないselect文は、特定の順序ではないと考えられるべきです。 しかし、SQL ServerとOracle(実際には2つのプラットフォームでテスト済み)では、 order by節のないテーブルから複数回クエリを実行すると、同じ順序で結果が得られます。 この動作は信頼できるのでしょうか? 誰もが少し説明するのを助けることができますか?


正解

これは、古いものを修正するために追加された新しい答えです。 私はTom Kyteから答えを得て、私はここに投稿します:

行をソートするには、順序を使用する必要があります。 if、and、or、but aboutsについて。 期間。 http://tkyte.blogspot.ru/2005/08/order-in-court.html IOTで注文する必要があります。 行はリーフブロックでソートされますが、リーフブロックはソートされて保存されません。 高速フルスキャン=未ソートの行。

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888

間違った答え

注意!質問の元の答えは、歴史のためだけにここに記載されています。間違った答えです。正しい答えは上記にあります)

Tom Kyteが前に述べた記事に書いたように:

ヒープ整理テーブルは、順序のない大きなコレクションとして考えるべきです。 これらの行は、一見無作為な順序で出てきます。使用されている他のオプション(パラレル問合せ、異なるオプティマイザ・モードなど)によっては、同じ問合せで異なる順序で出てくることがあります。 クエリにORDER BY文がないかぎり、クエリの行の順番を数えないでください!

しかし、彼はヒープで整理されたテーブルについてのみ話をしています。 しかし、インデックス組織図もあります。 その場合、主キーで暗黙的に定義された順序のため、 ORDER BY使わずに選択の順序に頼ることができます。 オラクルにとっても同じことです。

既定で作成されたSQL Serverクラスタ化インデックス(インデックス構成テーブル)。 また、PostgreSQLストア情報がインデックスごとに整列する可能性もあります。 詳細はhere

更新:私の答えに投票していることがわかります。 だから私は少し私のポイントを説明しようとするだろう。 「 索引構成表の概要」セクションには、次のようなフレーズがあります。

索引構成表では、表の主キーに定義された索引に行が格納されます。索引構成表は、関連するデータを一緒に格納する必要がある場合、またはデータを特定の順序で物理的に格納する必要がある場合に便利です。

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

インデックスのために、すべてのデータは特定の順序で格納されていますが、Pgについても同じことが当てはまります。 http://www.postgresql.org/docs/9.2/static/sql-cluster.html

あなたが私に同意しない場合は、私にドキュメンテーションのリンクを教えてください。 私は、私のために学ぶべきことがあることを知ってうれしいです。


いいえ、毎回同じ順序で結果を戻すことに頼ることはできません。 ページングされたグリッドを持つWebページで作業しているときにそれを発見しました。 私が次のページに行き、前のページに戻ると、前のページには異なるレコードが含まれていました。 私は完全に神秘的だった。

予測可能な結果を​​得るには、 ORDER BYを含める必要があります。 それでも、指定された列に同じ値がある場合、異なる結果が得られます。 予測可能な結果を​​得るために、あなたが本当に必要と思わなかったフィールドをORDER BYする必要があります。


トム・キテは、 この話題についてペットの悩みを抱えています 。 何らかの理由で、人々はこれに魅了され、ORDER BYを指定せずに特定の注文に頼ることができるケースを思いついていきます。 他の人が述べたように、あなたはできません。 AskTomのウェブサイトにあるこのトピックの別の面白いスレッドです。





sql-order-by