2016-09-03 14 views
0

私は大きなデータセットで作業しています。クエリを最適化する必要があります。私はビューabc_viewを持っています。以下のクエリビューは4回使用されます。したがって、ビューが実行されるたびに複雑なロジックが含まれます。ビューが1回だけ実行するクエリを作成するにはどうすればよいですか。複数回のビュー実行

Select * from TableA a 
    join abc_view v on(a.col1=v.line) 
    where v.type='abc' 
union all 
    Select * from TableA a 
    join abc_view v on(a.col1=v.group) 
    where v.type='bcd' 
union all 
    Select * from TableA a 
    join abc_view v on(a.col1=v.cat) 
    where v.type='cde' 
union all 
    Select * from TableA a 
    join abc_view v on(a.col1=v.test) 
    where v.type='def' 

クエリ実行に約5分かかります。私はabc_viewビューからテーブルを作成し、そのテーブルをクエリで使用して最適化する必要があると思ったのですか?

私に最適化クエリを提案します。

+0

あなたが参加するすべての列のインデックスを追加できるように、一時テーブルを作成することがあります。 – Barmar

+0

UNION ALLを削除し、各テンポラリ・テーブルを使用して各クエリ・データを格納し、そのテンポラリ・テーブルからデータを選択してストアド・プロシージャを作成します。 – Susang

答えて

0

それがうまくa.col1上

SELECT * FROM TableA a 
JOIN abc_view v ON a.col1 IN (v.line, v.group, v.cat, v.test) 
    AND v.type IN ('abc', 'bcd', 'cde', 'def') 

とインデックスを実行し、ビューのすべての4つの(v.line、v.group、v.cat、v.test)

1

ます。この希望をお試しくださいビューを一度参照すればパフォーマンスは向上しますが、保証はできません。標準SQLでは、次のようにすることができます。

Select * 
from TableA a join 
    abc_view v 
    on (a.col1 = v.line and v.type = 'abc') or 
     (a.col1 = v.group and v.type = 'bcd') or 
     (a.col1 = v.cat and v.type = 'cde') or 
     (a.col1 = v.test and v.type = 'def'); 

ただし、ハイブはおそらくこれを拒否します。

HiveがCTEを具体化するかどうかはわかりません。その場合は、これで問題が解決する可能性があります。

with v as (select * from abc_view) 
Select * 
from TableA a join 
     v 
     on(a.col1 = v.line 
where v.type='abc' 
union all 
Select * 
from TableA a join 
     v 
    on a.col1 = v.group 
    where v.type = 'bcd' 
union all 
Select * 
from TableA a join 
     v 
     on a.col1 = v.cat 
where v.type = 'cde' 
union all 
Select * 
from TableA a join 
     v 
     on a.col1 = v.test 
where v.type = 'def'; 

そうでない場合は、一時テーブルを使用する必要があります。

関連する問題