我正在使用我们公司只有读取访问权限的客户数据库 (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:如果你能找到更合适的东西,我很乐意编辑标题。