2017-04-06 5 views
1

HANAで2つのテーブルを結合しています。統計を取得するために、アイテムテーブルに3回LEFT結合して、処理されたエラー数、およびエラー数が表示されます。同じテーブルに集約された複数の左結合により、SAP HANAのパフォーマンスが大幅に低下します

これはデベロッパーシステムで、itemsテーブルには1500アイテムしかありません。しかし、以下のクエリは17秒間実行されます。

3つの集約条件のいずれかを削除すると(ただし、対応するJOINはそのままの状態)、クエリはほぼ即時に実行されます。

また、特定のJOINで使用されているフィールドにインデックスを追加しようとしましたが、違いはありません。

select rk.guid, rk.run_id, rk.status, rk.created_at, rk.created_by, 
count(distinct rp.guid), 
count(distinct rp2.guid), 
count(distinct rp3.guid) 
    from zbsbpi_rk as rk 
    left join zbsbpi_rp as rp 
     on rp.header = rk.guid 
    left join zbsbpi_rp as rp2 
     on rp2.header = rk.guid 
    and rp2.processed = 'X' 
    left join zbsbpi_rp as rp3 
     on rp3.header = rk.guid 
    and rp3.result_status = 'E' 
    where rk.run_id = '0000000010' 
    group by rk.guid, run_id, status, created_at, created_by 

答えて

0

私の謝罪ですが、私はこの質問をここに掲載していたことを忘れていました。私はanswers.sap.comで同じ質問を掲載しました。https://answers.sap.com/questions/172096/multiple-left-joins-with-aggregation-on-same-table.html

私は最終的に解決策を思いつきましたが、これは少し "ドッ"でした。瞬間:

select rk.guid, rk.run_id, rk.status, rk.created_at, rk.created_by, 
    count(distinct rp.guid), 
    count(distinct rp2.guid), 
    count(distinct rp3.guid) 
    from zbsbpi_rk as rk 
    join zbsbpi_rp as rp 
     on rp.header = rk.guid 
    left join zbsbpi_rp as rp2 
     on rp2.guid = rp.guid 
    and rp2.processed = 'X' 
    left join zbsbpi_rp as rp3 
     on rp3.guid = rp.guid 
    and rp3.result_status = 'E' 
    where rk.run_id = '0000000010' 
    group by rk.guid, run_id, status, created_at, created_by 

以降の左は、最初はとにかくすべてのレコードのスーパーセットを含んで参加するとのみ、最初の同じテーブルに参加するために参加する必要が参加します。

0

は、私はあなたがパフォーマンス向上のために照会を再書き込みすることができると思う:数の異なる場合が花上で動作しますを構築する場合

select rk.guid, rk.run_id, rk.status, rk.created_at, rk.created_by, 
count(distinct rp.guid), 
count(distinct (CASE WHEN rp.processed = 'X' then rp.guid else null end)), 
count(distinct (CASE WHEN rp.result_status = 'E' then rp.guid else null end)) 
    from zbsbpi_rk as rk 
    left join zbsbpi_rp as rp 
     on rp.header = rk.guid 
where rk.run_id = '0000000010' 
    group by rk.guid, run_id, status, created_at, created_by 

私は全くわからないのが、あなたは試すこと。

関連する問題