2016-08-26 7 views
1

私の目的に合った適切なSQLクエリを見つけたら、クエリが遅いことに気付きました。次のように私はこのフォームでクエリを使用する理由SQLクエリを一般的に保ち、それを速くする

WITH temp_table (t_col_1, t_col_2, t_col_3) AS 
(
    SELECT col_1 AS t_col_1, col_2 AS t_col_2, col_3 AS t_col_3 
    FROM actual_table 
    WHERE ID = 100 AND PID = 1245 
) 
SELECT t_col_1, t_col_2, t_col_3 
FROM temp_table AS t1 
WHERE t1.t_col_2 BETWEEN 1 AND 12541 
    AND t1.t_col_1 = (SELECT max(t2.t_col_1) 
        FROM temp_table AS t2 
        WHERE t2.t_col_1 < 15147 
         AND t2.t_col_2 = t1.t_col_2) 
ORDER BY t1.t_col_2 

理由は、次のとおりです。

  1. SQLクエリが生成されたデータをフェッチするためのMatlab内で使用されます。
  2. IDによっては、col_1とcol_2の列が交換されることがあります。これはt_col_1 = col_2とt_col_2 = col_1の理由です。この場合、Matlabスクリプトはcol_1 AS t_col_2とcol_2 AS t_col_1を置き換えます。

クエリを高速化する方法はありますか?

ありがとうございます。

答えて

0

問題は、メインクエリがWHERE基準をチェックするため、最大値がt_col_1であるクエリがすべての行で実行されていることです。代わりに、一度に実行サブクエリからmax(t2.t_col_1)値を生成することができますし、このように、自分の判断基準でその変数を使用します。

SELECT PID, t1.t_col_1, t1.t_col_2, t1.t_col_3 
FROM 
    (SELECT PID, t_col_1, t_col_2, t_col_3, max(t2.t_col_1) AS t_col_1_max 
    FROM temp_table 
    GROUP BY PID, t_col_1, t_col_2, t_col_3) 
    as t1 
WHERE 
    (t1.t_col_2 BETWEEN 1 AND 12541) 
    AND t1.t_col_1 < 15147 
    AND t1.t_col_1 = t1.t_col_1_max 
ORDER BY t1.t_col_2 

一時テーブルを生成するためのコードは正常に見えます。

+0

残念ながら、上記のSQLクエリは機能しません。内側のSELECTステートメントに間違いがありますか?ありがとう。 – grima

+0

多分1つのコメントmore;あなたのSQLクエリは、t_col_1とt_col_2が日付でも動作しますか?私の質問の数字は一例にすぎません。 – grima

+0

@grimaああ、私は 'GROUP BY'ステートメントを忘れました。内側のクエリは今すぐ動作するはずです。データが日付であればデータと一緒に動作するかどうかについては、テーブルのサンプルを私に渡すと、より良い答えが得られます。 – Rominus

0

答えは完全にあなたのクエリオプティマイザとデータベースの統計情報に依存しますが、これはデータベースの選択によって異なります。

  1. 量的緩和政策を取得 - 計画はあなたがしようとすることができ、クエリの最適化および/またはデータベースの統計情報を追加し、および/または必要なインデックス

を追加

  • 遅いクエリ実行プラン
  • 参照をクエリを微調整して幸運になるかもしれませんが、適切なアプローチはクエリプランを理解することです。

    例えば、 'max'が遅いのか、actual_tableがIDとPIDのインデックスのない10億行を持つことができるかを知る方法がありません。

  • 関連する問題