0

我正在开发一个登陆页面的项目。基本上,用户可以选择多个标准,这些标准将在 DB2 数据库上运行查询并返回结果。查询被分解为根据用户标准和插入的参数组装的各个部分。虽然我在处理一些从更大的表和连接中提取的巨大数据集时遇到了一些困难,但当我在数据库上运行一些性能数据时,有一个异常突出。

所有这些完全组装的查询的一个共同点是,它们在使用 id 列表中进行过滤。大约有六个这样的查询返回不同大小的数据集。它们中的大多数都非常简单,即:

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

这些子查询需要很长时间才能自行运行。但是,其中之一需要联合。本质上,一个表包含一个键,该键必须用于从两个不同的表中收集用户 ID,因此必须合并两组用户 ID 以获得子查询的单个列表,即:

TABLE.COLUMN IN (subquery UNION subquery)

我猜 DB2 优化器在处理带有联合的子查询时会遇到更多的限制,而不是使用一系列简单的连接,并且无法处理它。当涉及到它收集的数据量时,这个特定的子查询是中间的,所以它不是一个巨大的数据集的问题。

我想知道对于至少可以使该子查询与其他子查询保持一致的联合,我可能有哪些替代方案。做出改变可能有助于这种特殊情况,但对其他情况不利,反之亦然,这有点令人抓狂。我已经修补了一些东西,但没有运气。解释计划表明,至少正在使用正确的索引。我知道我没有太多示例,但是这些查询总体上非常庞大,很难简洁地发布必要的数据,但如果有必要,请告诉我,我会尝试将一些东西拼凑起来. 谢谢。

4

1 回答 1

2

您尝试以下两种替代 a 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 回答