0

我正在使用我们公司只有读取访问权限的客户数据库 (db2)。因此,我无法控制索引、模式等。我想强调这一点,因为可能还有我不知道在哪里的索引。所以我必须以不同的方式优化我们的查询。无论如何,我更感兴趣的是了解这些事情是如何工作的,而不是解决方法(尽管我也对此感兴趣)。我希望 DB 能够快速完成此类操作,但显然并非如此。或者,也许我遇到了一个严重的陷阱。

场景:我剖析了我们的查询,并将其剥离为以下我无法理解的内容。让我们称这个查询q1的形式为

select c.cid, c.bid, c.ryear, t.tyear, td.nr
 from mySchema.cTable c
 join mySchema.dTable d on d.cid = c.cid
 join mySchema.ipTable ip on (ip.did = d.did and ip.type = 'type_s')
 join mySchema.tTable t on t.xtime = ip.xtime
 join mySchema.tdTable td on c.tdid = 'type_'||td.oid
where
 c.ryear = 2009
 and d.rr = 'ugk'
 and d.stat = 'stat#1'
;

此查询检索大约 8000 个条目,并需要一分钟多的时间来执行。

现在奇怪的部分是:如果我删除where子句中的任何一个条件,查询的执行时间不到 2 秒。只是为了完整性:在我删除 ryear 的情况下,结果集返回大约 10000 个条目。如果我删除d.stat = 'stat#1'结果集包含大约 45000 个条目,如果我删除了d.rr = 'ugk'我实际上得到的结果与我不删除它完全相同(即在这种特定情况下,此条件对于结果集是多余的)。

如果我具备所有 3 个条件,谁能解释我如何/为什么会发生这种巨大的时差?如果我简单地设置 2 个条件,然后在 cli 上 grep 为第三个条件,我会快得多。DB到底在做什么?

注意:我使用 DbVisualizer 来运行我的查询。当我说在时间 x 执行时,我指的是查询的执行时间,而不是获取时间(参见:http ://www.dbvis.com/forum/thread.jspa?threadID=1536 )。d.rr = 'ugk'尽管如果我有所有 3 个语句(大约 10 分钟!)来检索与排除 and部分完全相同的结果,则提取时间也会急剧增加。对于我只有 2 个条件的情况,获取时间最多为 10 秒(即检索 45000 个条目时)。为了完整起见,如果我根本没有where,我会得到 130000 个条目(执行:1.8 秒,获取 28 秒)

我的问题:发生了什么事?where 子句中的单个语句能否将 dbs 执行计划破坏得如此糟糕?

ps:对不起,表/列的名称没有更具表现力,但出于明显的原因,我不得不对它们进行一些混淆。pps:如果你能找到更合适的东西,我很乐意编辑标题。

4

2 回答 2

0

慢查询通常表示全表扫描。你一般一切都通过索引而不是表扫描来。IBM Data Studio中可能有一些工具可以帮助您确定表扫描的原因。

我建议以下索引:

SET SCHEMA mySchema;
CREATE INDEX cTable_ryear ON cTable(ryear) INCLUDE (cid, bid, tdid);
CREATE INDEX dTable_rr_stat_cid ON dTable(rr, stat, cid) INCLUDE (did);
CREATE INDEX ipTable_did_type ON ipTable(did, type) INCLUDE (xtime);
CREATE INDEX tTable_xtime ON tTable(xtime) INCLUDE (tyear);

也可能有一种方法可以优化对 tdTable 的访问。

于 2015-05-29T19:00:46.997 回答
-1

你能告诉我们有哪些索引(SYSIBM.SYSINDEXES)吗?

也许您可以使用WITHaka 临时表将查询拆分为 2...

于 2015-05-29T19:23:45.517 回答