結果セット (約 150 万行) からの「ランダムな」出力を、ソートされた方法でファイルに入れたいと考えています。クエリで sort by コマンドを使用できることはわかっていますが、そのコマンドは「高価」です。結果セットの行をファイルに書き込むためのアルゴリズムがあり、最終的にコンテンツがソートされ、これでパフォーマンスが向上することはありますか? Java 1.6 を使用していますが、クエリには複数の結合があります。
4 に答える
テーブルの並べ替え基準のインデックスを定義すると、order by 句を問題なく使用でき、結果セットからのファイルを書き込むことができます。
クエリに複数の結合がある場合は、結合と並べ替え基準に対して適切なインデックスを作成します。プログラムでデータを並べ替えることができますが、時間を無駄にします。その時間は、データベース エンジンに既に存在する並べ替えアルゴリズムを再発明するのではなく、データベースを適切に調整/使用する方法を学ぶことで、より価値のあるものになります。
データベースのプロファイラーを入手して、クエリの実行計画を確認してください。
私の経験では、データベース側での並べ替えは通常、同じかそれ以上の速さです...確かに、並べ替える列にインデックスが付けられている場合
データを並べ替える必要がある場合は、誰かがそれを行う必要があります-あなたかデータベースのどちらかです。クエリにORDERBYを追加する方が確かに簡単です。しかし、あなたの側でそれをメモリ内でソートできない理由はありません。最も簡単な方法は、コンパレータを使用してソートされたコレクション(TreeSet、TreeMap)のデータをチャンクし、必要な列でソートすることです。次に、ソートされたデータを書き出します。
データベースから読み取る場合、適切なインデックスがあれば、ソートされた出力を取得するのにそれほど「費用がかからない」はずです。
ただし、複雑なクエリでは、SQL オプティマイザーがインデックスを適用するのが非常に難しい場合があります。その場合、DB は単に結果を一時テーブルに蓄積し、透過的に並べ替えます。
DB エンジンに加えられた最適化のレベルに匹敵する可能性はほとんどありません。しかし、DB によるソートを無効にするデータの後処理を行っているために問題が発生した場合は、自分でソートする以外に方法はありません。
繰り返しますが、最も簡単なのは DB を使用することです。適切なインデックスを使用して一時テーブルに書き込み、そこからダンプするだけです。
データが常に RAM に収まることが確実な場合は、データをメモリ内で並べ替えることができます。HD アクセスが不要であることがわかっているという理由だけで、DB エンジンを打ち負かすことができる唯一のケースです。
しかし、それは多くの「if」です。DBにとどまるほうがよい