web-dev-qa-db-ja.com

ORDER BYがビューに属していないのはなぜですか?

理解するあのあなた持てないORDER BYビューで。 (少なくとも私が作業しているSQL Server 2012では)

また、ビューを並べ替える「正しい」方法は、ORDER BYビューをクエリするSELECTステートメントを囲みます。

しかし、実用的なSQLとビューの使用法は比較的新しいので、理由を理解したいと思いますこれは意図的に行われます。履歴を正しくたどっていれば、これはかつて可能であり、SQL Server 2008などから明示的に削除されました(正確なバージョンについては引用しないでください)。

ただし、マイクロソフトがこの機能を削除した理由について私が思い付くことができる最も良い理由は、「ビューはデータの並べ替えられていないコレクション」であるということです。

ビューをソートしない理由は、論理的であると考えています。ビューをデータのフラット化したコレクションにできないのはなぜですか?なぜ具体的にunでソートされたのですか? (少なくとも私にとっては/私見で)ソートされたビューを持っていることが完全に直感的に見えるような状況を思いつくことはそれほど難しくないと思われます。

53
ngmiceli

(もちろん、インデックス付きビューは別です。)

ビューはマテリアライズされていません-データは保存されていないので、どのようにソートできますか?ビューは、パラメーターのないSELECTのみを含むストアドプロシージャのようなものです。ビューはデータを保持せず、クエリの定義を保持するだけです。ビューへのさまざまな参照にはさまざまな方法でデータを並べ替える必要があるため、これを行う方法-定義上、行の未ソートのコレクションでもあるテーブルから選択するのと同じように-外側のクエリでの順序を含めることです。

また、歴史に少し洞察を与えるために。 TOPを含めずに、ビューにORDER BY決して置くことはできません。この場合、ORDER BYは、TOPによってどの行が含まれるかを指定し、どのように表示されるかを指定しませんでした。たまたま、SQL Server 2000では、TOP100 PERCENTまたは{some number >= number of rows in the table}の場合、オプティマイザはかなり単純化されており、TOP/ORDER BYに一致する並べ替えのプランを作成することになりました。しかし、この動作は絶対に保証または文書化されていません- これは、悪い習慣である観察に基づいて信頼されていました 。 SQL Server 2005が登場したとき、オプティマイザの変更によりさまざまな計画と演算子が使用されたため、この動作は「中断」し始めました。特に、TOP / ORDER BYの場合、TOP 100 PERCENTは完全に無視されました。一部の顧客はこれについて大声で不満を述べ、Microsoftが以前の動作に戻すためにトレースフラグを発行しました。フラグの意味を説明するつもりはありません。フラグを使用したくないので、意図が正しいことを確認したいのです。予測可能な並べ替え順序が必要な場合は、外部クエリでORDER BYを使用してください。

要約し、あなたがしたポイントを明確にするために:マイクロソフトは何も削除しませんでした。彼らは製品をより良くし、副作用としてこの文書化されていない、保証されていない動作は信頼性が低くなりました。全体として、私はその製品がそれに対してより良いと思います。

39
Aaron Bertrand

ビューの並べ替えが許可されている場合、ここで結果の順序はどうなりますか?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 
9
Martin Smith

1つの可能性は、競合するソートを回避することです。ビューが1つの順序でソートされていて、そのビューの選択が別の順序でソートされている場合(ビューのソートを認識しない場合)、パフォーマンスに影響が出る可能性があります。したがって、ソート要件をユーザーに任せる方が安全です。

もう1つの理由は、並べ替えにはパフォーマンスコストが伴うため、一部のユーザーだけが並べ替えを必要とする場合に、ビューのすべてのユーザーにペナルティを課す理由です。

7
srini.venigalla

ANSI SQLは、さまざまな理由で最も外側のクエリでORDER BYのみを許可します。1つは、副選択/ビュー/ CTEが別のテーブルに結合され、外部クエリにORDER BY自体がある場合に発生します。

SQLサーバーはビュー内でこれをサポートしていません(TOP 100 PERCENTを使用して騙した場合を除き、私の意見では主にバグを引き起こしています)。

バグを引き起こしたとしても、結果は信頼できるものではなく、並べ替えが常に期待した方法で行われるとは限りませんでした。

完全な技術的説明については、クエリオプティマイザーチームによるこのブログ投稿を参照してください TOP 100パーセントORDER BYは有害と見なされます。

このコードのデフォルトのプラン実装では、TOPオペレーションの実行の一部として行がソートされます。多くの場合、これは結果が並べ替えられた順序で返されることを意味し、これにより顧客は行が並べ替えられることが保証されていると信じました。これは実際にはそうではありません。行がソートされた順序でユーザーに返されるようにする場合は、最も外側のクエリブロック(ANSIごと)でORDER BYを使用して、出力の表示順序を保証する必要があります。

ビューは、クエリの結果によって内容が決まるテーブルのように動作します。

テーブルには順序がありません。それらは単なる行の袋です。

したがって、ビューにも順序はありません。ただし、特定のORDERの行を選択することでそれらをソートできます。

3