oracleでは、UNIONを使用して2つのテーブルを暗黙的にソートしますか? EXPLAIN PLANウィンドウに表示されているように、「SORT UNIQUE」が表示されるため、表示されます。UNION内でソートする
私の質問は、デフォルトでは、どのようにしてどの列でソートされるのですか?
oracleでは、UNIONを使用して2つのテーブルを暗黙的にソートしますか? EXPLAIN PLANウィンドウに表示されているように、「SORT UNIQUE」が表示されるため、表示されます。UNION内でソートする
私の質問は、デフォルトでは、どのようにしてどの列でソートされるのですか?
UNION
がUNION ALL
のような重複を含まないので、はい、ソートが必要にただした場合の保証は、ソートあなたが希望それは必要ない
をソート得ることを確認するために、すべての組合後ORDER BY
を使用し、重複を除去するために潜在的に含まれています一意性を強制するために、通常は少なくとも部分的な並べ替えを行う必要があります。 理論上、別のメカニズム(パーティションキーが重複しないことが保証されている特定のパーティションから選択するなど)によって一意性が保証できる場合、それはそうではないかもしれませんが、まだその例は見ていません。
しかし、ハッシュソートを使用できるので、ソートされた出力を生成する必要はありません。つまり、すべての 'A'単語を1つのバケットに貼り付け、すべての 'B'単語を次の単語に貼り付けるなどです。個々のバケットの内容はソートされますが、クエリは 'B'バケットの結果を 'A'バケットの前に返します。
9iから10gの間で、OracleはGROUP BYを変更して、多くの場合、ハッシュ・ソートを行いました。その結果、GROUP BYがソートされた出力を暗示するということは、当然取り上げられた多くの人々が巻き込まれました。
+1が、「ハッシュ・ソート」の代わりに「ハッシュ・グループ・バイ」と表示されている可能性があります。 –
union
,group by
、distinct
などのオプティマイザには、一意性を保証するさまざまな方法があります。そして、オラクルがオプティマイザを改良するにつれて、新しい方法が導入され、うまくいきます。時にはそれは並べ替えです。しかし、たとえそれが今日の並べ替えを使用していても、明示的ではないかもしれないという保証はありません。
出力をソートする必要がある場合は、これを保証する唯一の方法はorder by
節です。 order by
Oracleがないと(そしてそれに関してはどんなSQLデータベースでも)自由に任意の順序で行を返すことができます。
@cyberkiwi:賢明であることをお詫び申し上げます。オプティマイザがプランがより少ないリソースで実行されると考えられる場合、Oracleはハッシュ・テーブルの代わりにプレーン・ソートを使用できます。私は、ソートの削除をハッシュテーブルに置き換えたスイッチを採用しています。したがって、クエリは今日グループ化/結合/ソートすることができ、明日ハッシュテーブルに変更され、2013年に12gR2にアップグレードするときにはまだ作成されていないものがあります。 –
12cR2を意味しますか? ;-) –
これは、Order byを使用せずに、結果がソートされるデフォルトの列またはプロセスがないことを意味しますか?私はあなたが選択した文の配列を使ってソートされていると思っていました。私はこれについて間違って考えていますか? – Jenny
-1 "重複を削除するためにソートが暗黙的です"オプティマイザは、重複を削除するためにハッシュテーブルを使用することにします。 –
@ジェニー:はい、間違っています。 'order by'がなければ、データベースは任意の順序で行を返すことができ、毎回同じ順序でそれらを返すという保証はありません。あなたはあなた自身の前の主張を確認することができます: 'select table_name from dictionary'(または他の大きなシステムテーブル)を試してみてください。 – Allan