8

一般的に、JOINを使用して行を選択する場合とEXISTS where句を使用する場合のパフォーマンスに違いはありますか?さまざまなQ&A Webサイトを検索すると、結合の方が効率的であることがわかりますが、TeradataではEXISTSの方が優れていることをずっと前に知ったことを思い出します。

これこれのような他のSOの答えはありますが、私の質問はTeradataに固有のものです。

たとえば、同じ結果を返す次の2つのクエリについて考えてみます。

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
join     MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
group by 1
order by 1

-と-

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
where exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1

両方のテーブルのプライマリインデックス(一意)は「srv_accs_id」です。MY_BASE_TABLEはかなり大きく(2億行)、MY_TARGET_TABLEは比較的小さい(200,000行)。

EXPLAINプランには1つの重要な違いがあります。1つ目は2つのテーブルが「RowHash一致スキャンによって」結合され、2つ目は「すべての行のスキャンによって」結合されることを示しています。どちらも「すべてのAMPのJOINステップ」であり、合計推定時間は同じ(0.32秒)であると述べています。

どちらのクエリも同じように実行されます(Teradata 13.10を使用しています)。

LEFT OUTERJOINと対応するISNULLwhere句をNOTEXISTSサブクエリと比較して不一致を見つける同様の実験では、パフォーマンスの違いが示されています。

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
left outer join MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
where    x.srv_accs_id is null
group by 1
order by 1

-と-

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
where not exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1 

2番目のクエリプランはより高速です(EXPLAINで説明されているように2.21秒対2.14秒)。

私の例は些細なことで違いがわかりません。コーディングガイダンスを探しています。

4

1 に答える 1

7

NOT EXISTSは、LEFT OUTER JOINを使用して、ISNULL条件を使用して参加テーブルから欠落しているレコードを除外するよりも効率的です。オプティマイザーはNOTEXISTS述部でEXCLUSIONMERGEJOINを使用することを選択するためです。

2番目のテストでは、使用していたデータセットに対して印象的な結果は得られませんでしたが、データ量が増えると、NOT EXISTS overLEFTJOINからのパフォーマンスの向上が非常に顕著になります。テーブルは、LEFT JOINの場合と同じように、NOTEXISTS結合に参加する列によってハッシュ分散される必要があることに注意してください。したがって、データの偏りはEXCLUSIONMERGEJOINのパフォーマンスに影響を与える可能性があります。

編集:

通常、結合ソリューションの書き直しに使用するのではなく、INの代わりにEXISTSを使用します。これは、論理比較に参加している列がNULLになる可能性がある場合に特に当てはまります。だからといって、INNERJOINの代わりにEXISTSを使用できなかったわけではありません。EXCLUSION JOINの代わりに、INCLUSIONJOINになります。INNER JOINは、本質的にはインクルージョン結合です。私が見落としているニュアンスがあると思いますが、時間をかけて読みたい場合は、マニュアルでそれらを見つけることができます。

于 2012-12-04T18:35:42.573 に答える