1

嗨,我有一个 DB2 查询,如下所示

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

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

结果集:

数数

618543562

对于上述查询,我​​什至尝试使用 Count(1),但是当我采用访问计划时,成本是相同的。

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

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

结果集:

数数

618543562

有没有其他方法可以降低成本。

PS: b.xxx,b.yyy, c.wedf 被索引..

提前致谢。

4

2 回答 2

1

我认为问题之一是表格上的统计信息。你执行了Runstats吗?可能数据分布或必须读取的行数很多,DB2 得出结论最好读取整个表,而不是处理索引,然后从表中获取行。

似乎这两个查询都采用相同的访问计划,我认为他们正在执行表扫描

三列是否属于同一个索引?或者它们被单独索引?如果它们是不同索引的一部分,访问计划中的索引之间是否有任何ANDing ?如果没有不同索引的 ANDing,则必须从表中读取列才能处理谓词。

count(1) 和 count(*) 给出相同成本的原因是因为两者都必须执行 TableScan。

请看一下访问计划,不仅是timerons的结果,还有步骤。访问计划是否采用索引?执行了多少种?

尝试更改优化级别,您会看到访问计划发生了变化。我认为您正在使用默认的 (5)

如果要强制查询考虑索引,可以创建优化配置文件

于 2012-12-07T08:07:11.203 回答
1

(B,C)表和A表之间的关系是什么。在您的查询中,您只需在 A 和 (B,C) 之间使用CROSS JOIN 。所以这是主要的性能问题。

如果你真的需要这个计数,只需将 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 回答