GROUP BY の結果は、SQL 標準に従ってソートする必要がありますか?
多くのデータベースは、GROUP BY に対してソートされた結果を返します。
しかし、それはSQL92または他の標準によって強制されていますか?
GROUP BY の結果は、SQL 標準に従ってソートする必要がありますか?
多くのデータベースは、GROUP BY に対してソートされた結果を返します。
しかし、それはSQL92または他の標準によって強制されていますか?
いいえGROUP BY
。返される行の順序に標準的な影響はありません。それ がそのORDER BY
ように設計されていることです。
によって返されるある種の反復可能または予測可能な並べ替え順序を取得している場合GROUP BY
、それは標準で定義されていない DBMS で行われていることです。
以前の回答で説明したように、 以外の基本的な SQL 構造によってソートが暗示されることはありませんORDER BY
。
ただし、 を計算するGROUP BY
には、(バケットを作成するために) インデックス スキャンまたはメモリ内並べ替えが行われる可能性があり、そのようなインデックス スキャンまたは並べ替えは、並べ替えられた順序でデータを走査することを意味します。したがって、特定のデータベースがしばしばこのように動作するのは偶然ではありません。ただし、これに依存しないでください。インデックスのセットが異なる場合や、クエリ プランが異なる場合 (いくつかの挿入やデータベース サーバーの再起動によってのみトリガーされる可能性があります) は、動作が非常に大きくなる可能性があります。違う。
ORDER BY
また、句内の列リストを並べ替えると、出力が確実に並べ替えられますが、句内の列リストを並べ替えてGROUP BY
も、ほとんど効果がないことに注意してください。
一見「冗長」な ORDER BY を使用しても、パフォーマンス コストは発生しません。元のクエリ プランが既に並べ替えられた出力を保証している場合、クエリ プランは同じになる可能性があります。
GROUP BY の出力をソートすることは標準にはありません。グループ化には標準アルゴリズムがあり、結果が順序どおりに生成されないためです。
これらの中で最も一般的なのは、グループ化を行うためのハッシュ テーブルの使用です。
さらに、マルチスレッド サーバーでは、データを並べ替えることができますが、結果はプロセッサごとに返されます。最下位のプロセッサが最初にデータを返すという保証はありません。
また、並列マシンでは、さまざまな方法を使用してデータをプロセッサ間で分割できます。たとえば、「a」で終わる文字列はすべて、1 つのプロセッサに送られます。「b」で終わるものはすべて別のものに。これらはローカルでソートできますが、結果自体は全体的にソートされません。
group by の後のソートを保証する mysql などのデータベースは、設計上の決定が不適切です。このようなデータベースは、標準に準拠していないだけでなく、アルゴリズムの選択を制限したり、順序付けに追加の処理を課したりします。