建议需要避免大视图中的表扫描w /许多重复值

时间:2011-01-11 14:57:22

标签: db2

有人能提供加速我们的流程的解决方案吗?我们有一个用于报告的视图,它是10个表的联合。该视图有1.8亿行。我们想要生成各列的不同值的列表。报告工具生成的当前SQL在视图上执行select选择,需要10分钟。优选地,解决方案将自动更新。我们一直在尝试在DB2 udb V8中创建一个MQT作为联合所有,立即刷新但收效甚微。任何建议都将不胜感激。

查尔斯。

1 个答案:

答案 0 :(得分:0)

DB2 8.2中存在许多限制用于刷新即时MQT的限制,并且它们会对写入基表的应用程序产生显着的性能影响。也就是说,可以能够使用MQT。但是,不要使用SELECT DISTINCT,而是尝试使查询看起来像:

select yourcolumn, count(*) as ignore
from union_all_view
group by yourcolumn

必须将列(yourcolumn)定义为NOT NULL才能使其工作(在DB2 8.2中)。如果仍然针对union all视图发出SELECT DISTINCT,则优化器可能不会选择此MQT,因此您可能需要直接查询MQT(或在其上定义的视图)。忽略MQT中的“ignore”列 - 仅适用于DB2;如果你真的不想看到它,你可以在MQT之上创建一个vew。

但是,这确实是一个数据库设计问题。为什么需要扫描1.8亿行数据才能找到特定列中的唯一值?为什么这些值不存在于它们自己的表中,并且从10个基表中的每一个都定义了外键?