2017-04-11 6 views
0

クエリの実行中にデータベースサーバー上の空きディスク領域が不足しているために失敗した従来のsqlクエリを最適化する必要があります(一時テーブルと出口に20ギガエラーあり)。フィールドの値に応じたデータの集約

クエリは、照会されたテーブルのフィールドの値に応じて異なるエイリアスにデータを集約するため、少し複雑です。主なアイデアは、オプションのグループでテーブルをクエリし、その結果のテーブルのエイリアスカラムの値を作ることです。

スキーマとクエリのサンプルは、http://sqlfiddle.com/#!9/64e86/2/0です。実際のクエリには、IN句に10-12 opt_typesのようなものがあります。

問題は、両方のテーブルでそれぞれ2.5kk行と18.5kk行に似ているということです。

このデータ量が少ない(70kと750k)場合、このクエリは完璧かつ短時間で実行されます。

大量のデータでこのクエリを実行するにはどうすればよいでしょうか? データベースはMySQL 5.6です。照会はネイティブのmysql < query_file.sqlコマンドを使用してbashスクリプトによってサーバーに入力されます。ヌルを除いて、彼らは」 -

PS静かは率直に言って、私は

+1

「2.5kk」とは何ですか?何百万? –

+0

また、質問にもすべてを載せてください。リンクが壊れます。特にSQLFiddle。 –

答えて

0

GROUP_CONCATは単にグループwithininすべてのフィールド値を連結(、正確なGROUP_CONCAT(DISTINCT IF(...) ORDER BY ... ASC SEPARATOR ', ')を使用して一部であるように)このクエリがどのように機能するかを理解するには本当にないんだけど再落ちた。 SUMとまったく同じように、あるいは他のアグリゲーター関数:MAX、MIN、何でも。

この場合、グループ内で発生した特定のタイプのすべての異なる(互いに)値のソートされたリストがコンマで区切られて表示されます。

あなたの質問には...ディスク容量を増やしてください。 格安&が安いです。

本当に、特にTHATクエリを大幅に最適化する方法はありません。

そして、私はそれを変更する、またはデータベースのスキーマは、反対側のアプリを壊すだろうと思う。右? いいえ、実際には「ブレーク」しませんが、避けたい論理変更が必要です。

関連する問題