2017-05-28 7 views
0

TとT1は同じ表を参照してください。 最大値を取得しようとしていますが、最大値を取得している間は、 は等しいcolumnC値を持つ行に興味があります。maxを含むSQLクエリを最適化する方法は?

select * 
from table T 
where T.columnA in (0,1,2,3) 
    and T.columnB = (select max(T1.columnB) 
        from table T1 
        where T1.columnC = T.columnC) 
+0

Hibernateとは何が関係していますか?タグを削除します。 –

+1

どのDBMSを使用していますか? Postgres?オラクル? DB2?ファイアバード? –

+0

@a_horse_with_no_name:postgres、DB2、Oracle - 休止状態を経由します。 –

答えて

1

このタイプのクエリは、ウィンドウ関数を使用して一般的に、より効率的である:columna上の条件は、その列のインデックスが役立つだろう非常に選択的である

select * 
from (
    select *, 
     max(columnb) over (partition by columnc) as max_b 
    from the_table 
    where columna in (0,1,2,3) 
) t 
where columnb = max_b; 

場合。あなたが欲しいん場所についてcolumna between 0 and 3

0

わからないにcolumna in (0,1,2,3)を変更する場合、一部の最適化プログラムは、より効率的な計画を生成することがあります(どの層)columnAフィルタ、多分このような:

Select tt1.* from table tt1 
inner join 
(
    select * from 
     table t1 
     inner join 
     (select max(T0.columnB) max_columnB 
      from table t0) t2 
      on t1.columnB = t2.max_columnB 
) tt2 
on tt1.columnC = tt2.columnC 
Where tt1.columnA in (0,1,2,3) 

インデックスがcolumnAのために必要とされます、およびcolumnBとcolumnCが高速で実行されます。

0

a_horse_sith_no_nameは、ウィンドウ関数が一般に良いアプローチです。ウィンドウの機能やクエリに関係なく、インデックスが役立ちます。

特に、インデックスはT(columnc, columnb)T(columnA)になります。それは2つの別々のインデックスです。 SQLオプティマイザは、クエリとウィンドウ関数アプローチの両方のインデックスを利用できなければなりません。