是否可以索引/插入DB2大型表的键以加快选择速度?

suzh9iv8  于 2023-03-29  发布在  DB2
关注(0)|答案(1)|浏览(98)

我知道这个问题可能已经被问过很多次了,但是请耐心听我说;我也不是SQL方面的Maven,尤其不是DB2 SQL方面的Maven,我们使用的是在z/OS上运行的DB2 12。

我需要加快从人员表中进行选择的速度,该表有超过500万行。这是一个旧的DB2表,结构不智能,也没有主键或任何东西。**但是,如果有帮助的话,我可以创建键或索引。**因此,我的问题是:**它会有帮助吗?如果是,创建键/索引的最佳方法是什么?**情况如下:

除了姓名和地址等信息外,该表还包含PERSONTYPE(char 1),一个PERSONCODE(char 8)和一个DNUM(char 16),其中DNUM是一种与该人相关联的案件编号。(如果一行有DNUM,它就没有PERSONCODE)我需要找到所有有特定DNUM子集的行,几行可以有相同的DNUM因为几个人可以被绑定到一个案例。所以这是SQL:

SELECT NAME, ADRESS, SHOESIZE FROM PERSONTABLE WHERE DNUM IN ([a set of 1000 DNUMS])

此查询大约需要55秒才能产生结果。作为比较,此查询:

SELECT NAME, ADRESS, SHOESIZE FROM PERSONTABLE P JOIN OTHERTABLE O ON (P.PERSONCODE = O.PERSONCODE) WHERE O.DNUM IN ([same set of 1000 DNUMS])

需要大约2秒。(是的,此OTHERTABLE也有DNUM列。)
这是数据迁移项目的一部分,整个执行时间的95%都被第一个SQL占用了,所以我热衷于尝试加快速度。
我可以为PERSONTABLE索引和插入键,但是由于DNUM不是唯一的列,所以我不能将其作为主键。然而,PERSONTABLE中有一个ORDER_NUMBER列,用于对案例中涉及的每个人进行编号,因此DNUM+ORDER_NUMBER可能会成为主键。但是这会加快选择速度吗?这是一个旧表,不想在不知道它会做什么的情况下弄乱它。
重复一遍,系统是运行在z/OS上的DB212。
你们谁有什么建议?

uubf1zoe

uubf1zoe1#

答案比我想象的要简单得多,我把它留在这里,以防有人和我一样没有经验,来这里看看。
答案是肯定的,你可以明确地加快选择的速度,只需要在你最常用的“where”子句的列上创建一个索引。

CREATE INDEX WHATEVER ON PERSONTABLE(DNUM);
CREATE INDEX WHATEVER_AGAIN ON PERSONTABLE(PERSONCODE)

由于我的项目是一个只运行一次的项目,并且我只需要特定类型的人员,所以我首先将相关数据从PERSONTABLE复制到PERSONTABLE_TEMP,这将行数从500万减少到50万。然后我在减少的表上创建索引。
第一个查询从50秒到0.5秒,大约快了100倍。

相关问题