极不相称的查询运行时间。试图理解RDBMS

时间:2015-05-29 15:52:53

标签: sql performance db2 rdbms dbvisualizer

我正在使用客户数据库(db2),我们公司只有读取权限。因此,我对索引,架构等没有任何控制权。我想强调这一点,因为仍然可能有指数我不知道在哪里。所以我必须以不同方式优化我们的查询。无论如何,我更感兴趣的是理解这些东西是如何工作的而不是在解决方法中(尽管我也对此感兴趣)。我希望数据库能够快速进行这些操作,但显然它们不是。或许我遇到了严重的陷阱。

场景: 我解剖了我们的查询,并将其剥离到以下,这对我来说是不可理解的。我们将此查询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个条件然后grep on cli for the third one,我会快得多。 DB做什么了?

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

我的问题:发生了什么事? where子句中的单个语句可以如此严重地破坏dbs执行计划吗?

p.s。:对不起,表/列的名称不是更具表现力,但由于显而易见的原因,我不得不对它们进行模糊处理。 p.p.s:如果你能找到更合适的东西,我很乐意编辑标题。

2 个答案:

答案 0 :(得分: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的访问。

答案 1 :(得分:-1)

您能告诉我们哪些索引到位(SYSIBM.SYSINDEXES)?

也许您可以使用WITH临时表...

将查询拆分为2