1

こんにちは、以下のようなDB2クエリがありました

select count(*) as count from 
table_a,
table_b,
table c

where
b.xxx=234 AND
b.yyy=c.wedf 

結果SEt:

カウント

618543562

上記のクエリでは、Count(1) でも試しましたが、アクセス プランを使用した場合、コストは同じです。

select count(1) as count from 
    table_a,
    table_b,
    table c

    where
    b.xxx=234 AND
    b.yyy=c.wedf 

結果SEt:

カウント

618543562

コストを削減する他の方法はありますか。

PS: b.xxx,b.yyy, c.wedf にインデックスが付けられています..

前もって感謝します。

4

2 に答える 2

1

(B、C)テーブルとAテーブルの関係は何ですか。クエリでは、Aと(B、C)の間でCROSSJOINを使用します。つまり、これが主なパフォーマンスの問題です。

このカウントが本当に必要な場合は、Aと(B、C)のカウントを掛けるだけです。

select
     (select count(*) from a) 
      * 
     (select count(*) from b, c where b.xxx=234 AND b.yyy=c.wedf )

DB2の場合、これを使用します。

     select a1.cnt*
            (select count(*) as cnt2 from b, c where b.xxx=234 AND b.yyy=c.wedf )
     from 
        (select count(*) as cnt1  from a) a1
于 2012-12-07T08:22:14.260 に答える
1

問題の 1 つはテーブルの統計だと思います。Runstatsを実行しましたか? おそらく、データ分散または読み取る必要がある行の量が多いため、DB2 は、索引を処理してから表から行をフェッチするよりも、表全体を読み取ったほうがよいと結論付けます。

両方のクエリが同じアクセス プランを使用しているようで、テーブル スキャンを実行していると思います。

3 つの列は同じインデックスの一部ですか? またはそれらは別々に索引付けされていますか?それらが異なるインデックスの一部である場合、アクセス プラン内のインデックス間にANDingがありますか? 異なるインデックスとの ANDing がない場合は、述語を処理するためにテーブルから列を読み取る必要があります。

count(1) と count(*) のコストが同じである理由は、どちらも TableScan を実行する必要があるためです。

timeron での結果だけでなく、手順も含めて、アクセス プランを参照してください。アクセス・プランは索引を取りますか? いくつのソートが実行されていますか?

最適化レベルを変更してみると、アクセス プランが変更されることがわかります。デフォルトのもの(5)で実行していると思います

クエリにインデックスを考慮させたい場合は、最適化プロファイルを作成できます

于 2012-12-07T08:07:11.203 に答える