0

ランディングページのプロジェクトに取り組んでいます。基本的に、ユーザーが選択できる基準は複数あり、DB2 データベースで照会を実行して結果を返します。クエリは、挿入されたユーザー基準とパラメーターに応じて組み立てられるさまざまな部分に分割されます。さらに大きなテーブルと結合から引き出された巨大なデータセットを返すものにはいくつかの問題がありますが、データベースでいくつかのパフォーマンス数値を実行すると、奇妙なものとして際立つものがあります。

これらの完全に組み立てられたクエリのすべてに共通することの 1 つは、それらが使用 ID のリストでフィルター処理されることです。さまざまなサイズのデータ​​セットを返すこれらのクエリが半ダースほどあります。それらのほとんどは非常に簡単です。つまり、次のとおりです。

TABLE.COLUMN IN (subquery with a few joins that returns a column of user ids)

これらのサブクエリは、単独で実行するには非常に時間がかかります。ただし、これらのうちの 1 つはユニオンを必要とします。基本的に、1 つのテーブルには、2 つの異なるテーブルからユーザー ID を収集するために使用する必要があるキーが含まれているため、サブクエリ用の 1 つのリストを取得するには、ユーザー ID の 2 つのセットを結合する必要があります。

TABLE.COLUMN IN (subquery UNION subquery)

私の推測では、DB2 オプティマイザーは、単純な一連の結合を使用するサブクエリよりもユニオンを使用してサブクエリを実行する場合の方がはるかに多くの制限に遭遇し、それを処理することもできません。この特定のサブクエリは、収集するデータの量に関しては中途半端であるため、巨大なデータセットでは問題になりません。

少なくともこのサブクエリを他のサブクエリと一致させるユニオンに代わるものは何かと思っています。変更を加えると、この特定のケースには役立つかもしれませんが、他のケースに不利益をもたらす、またはその逆の場合は、少し腹立たしいです。私はいくつかのことをいじりましたが、運がありません。説明計画は、少なくとも適切なインデックスが使用されていることを示しています。例があまりないことはわかっていますが、これらのクエリは全体的にかなり大規模であり、必要なデータを簡潔に投稿するのは難しいでしょうが、必要な場合はお知らせください。何かをまとめてみます. . ありがとう。

4

1 に答える 1

2

a に対して次の 2 つの代替案を試しますunion

WHERE   TABLE.COLUMN IN (subquery1)
        OR TABLE.COLUMN IN (subquery2)

またはフィルタリング結合を使用します。

SELECT  *
FROM    TABLE T
LEFT JOIN   
        (
        subquery1
        ) f1
ON      f1.COLUMN = T.COLUMN
LEFT JOIN   
        (
        subquery2
        ) f1
ON      f2.COLUMN = T.COLUMN
WHERE   f1.COLUMN IS NOT NULL
        OR f2.COLUMN IS NOT NULL
于 2013-04-02T19:02:07.920 に答える