sql >> データベース >  >> RDS >> Sqlserver

SELECTクエリのデフォルトの行順序-SQLServer2008とSQL2012

    戻ってORDER BYを追加する必要があります 句がないと順序が保証されないため、コードに句を追加します。過去にあなたはいつも同じ注文を受けたのは「幸運」でしたが、SQLServer2008がとにかくそれを保証したからではありませんでした。ほとんどの場合、インデックスまたはデータがディスクに保存されている方法に関係していました。

    アップグレード時に新しいホストに移動した場合、ハードウェア構成の違いだけで、クエリの実行方法が変わった可能性があります。新しいサーバーがテーブルの統計を再計算し、SQLServer2012クエリオプティマイザーがSQLServer2008のものとは少し異なることを行うという事実は言うまでもありません。

    SQLの結果セットの順序を、必要な順序を明示的に指定せずに信頼できるのは誤りです。SQLの結果決して ORDER BYを使用せずに信頼できる注文がある 句。 SQLは集合論に基づいて構築されています。クエリ結果は基本的にセット(またはマルチセット)です。

    Itzik Ben-Ganは、彼の著書Microsoft SQL Server 2012 T-SQL Fundamentals

    で、SQLに関連する集合論について適切に説明しています。

    数学者のゲオルク・カントールに端を発した集合論は、リレーショナルモデルの基礎となる数学の分野の1つです。 Cantorのセットの定義は次のとおりです。

    「セット」とは、私たちの知覚または思考の明確で別個のオブジェクトm(Mの「要素」と呼ばれる)の全体へのコレクションMを意味します。 -ジョセフ・W・ドーベンとゲオルク・カントール(PrincetonUniversity Press、1990)

    定義の用語を徹底的に説明した後、Itzikは次のように述べています。

    Cantorのセットの定義が省略しているものは、おそらくそれが含むものと同じくらい重要です。定義では、セット要素間の順序については言及されていないことに注意してください。セット要素がリストされる順序は重要ではありません。セット要素をリストするための正式な表記法では、中括弧{a、b、c}を使用します。順序には関連性がないため、{b、a、c}または{b、c、a}と同じセットを表現できます。アレーションのヘッダー(SQLではテーブルと呼ばれる)を構成する属性のセット(SQLでは列と呼ばれる)にジャンプすると、要素は序数ではなく名前で識別されることになっています。同様に、リレーションの本体を構成するタプルのセット(SQLでは行と呼ばれます)について考えてみます。要素は、位置ではなく、キー値によって識別されます。多くのプログラマーは、テーブルのクエリに関して、行の間に順序がないという考えに適応するのに苦労しています。 つまり、テーブルに対するクエリは、任意の順序で行を返すことができます。 おそらくプレゼンテーションの目的で、データを特定の方法で並べ替えることを明示的に要求しない限り。

    ただし、セットの学術的な定義に関係なく、SQL Serverでの実装でさえ、結果の順序が保証されることはありません。クエリオプティマイザチームのメンバーによる2005年のこのMSDNブログ投稿では、中間操作からの順序にまったく依存してはならないと述べています。

    並べ替えルールは、この仮定に違反する可能性があり、違反する可能性があります(開発者にとって不便な場合は、違反します;)。より効率的なプランを見つけるために操作を並べ替えると、ツリー内の中間ノードの順序付けの動作が変わる可能性があることを理解してください。特定の中間順序を想定した操作をツリーに配置すると、破損する可能性があります。

    Conor Cunningham(アーキテクト、SQL Serverコアエンジン)によるこのブログ投稿「シートベルトなし-ORDERBYなしで注文を期待する」はSQLServer 2008に関するものです。彼は20k行のテーブルを持ち、単一のインデックスで常に行を返すように見えます。同じ順序。 ORDER BYを追加する クエリに追加しても実行プランは変更されないため、オプティマイザがクエリを必要としないことに気付いた場合にクエリを追加すると、クエリのコストが高くなるわけではありません。しかし、彼がテーブルにさらに20k行を追加すると、クエリプランが突然変更され、並列処理が使用されるようになり、結果は順序付けられなくなります!

    ここで難しいのは、計画がいつ変更されるかを外部ユーザーが知るための合理的な方法がないことです。すべての計画のスペースは巨大であり、熟考するためにあなたの頭を傷つけます。 SQL Serverのオプティマイザーは、単純なクエリの場合でも、十分なパラメーターが変更されると、計画を変更します。運が良ければ計画を変更できない場合があります。または、この問題について考えずにORDERBYを追加することもできます。

    さらに説得力が必要な場合は、次の投稿を読んでください:

    • ORDER BYがない場合、デフォルトのソート順はありません。 -アレクサンダークズネツォフ
    • 裁判所で命令してください! -トーマス・カイト
    • SQLでの結果セットの順序-TimothyWiseman



    1. OracleCONNECTBYとの混同

    2. SQL ServerStandardEditionの高可用性の将来

    3. Azureサーバーレスの概要

    4. 共通のMSSQLServerパフォーマンスインジケーターの実装