Sql 在DB2中,从表和子选择中删除行的最佳方式是什么?

Sql 在DB2中,从表和子选择中删除行的最佳方式是什么?,sql,db2,common-table-expression,dashdb,Sql,Db2,Common Table Expression,Dashdb,数据库 Db2 场景 我有下面的代码,其中在一个节点表上,我有大约135k行和一个节点列表公共表,该表有大约4k行,从节点中删除所有可以在节点列表中找到的行大约需要48秒 我希望运行查询,使其在5秒内完成 此外,我注意到,随着向节点表中添加更多节点,其效率可能会降低 当前解决方案 SELECT COUNT (*) FROM OLD TABLE( DELETE FROM NODE n WHERE EXISTS (SELECT * FROM NODE_LIST nl WHERE nl.ID =

数据库

Db2

场景

我有下面的代码,其中在一个节点表上,我有大约135k行和一个节点列表公共表,该表有大约4k行,从节点中删除所有可以在节点列表中找到的行大约需要48秒

我希望运行查询,使其在5秒内完成

此外,我注意到,随着向节点表中添加更多节点,其效率可能会降低

当前解决方案

SELECT COUNT (*) FROM OLD TABLE(
   DELETE FROM NODE n WHERE EXISTS (SELECT * FROM NODE_LIST nl WHERE nl.ID = n.ID)
);

您要删除的节点id是否随机分布在节点表中?是否可以使用群集索引来减少每次删除节点id的页面数。或者使用MDC表

似乎最好的答案是我发布的原始解决方案,并添加了索引(正如一些用户所建议的):

此外,还有更好的方法(比如创建一个永久索引表,我们可以使用),但我们决定暂时使用临时表方法


使用我们创建了一个解释计划,帮助我们应用正确的索引并显著提高我们的性能。

您在
节点列表(id)
上有索引吗?这是一个主键我将从发布语句解释计划开始。如果是主键,则不会自动创建索引。添加一个索引并尝试删除,但这难道不会推迟不可避免的事情吗?随着我添加更多节点,查询速度会减慢?
SELECT COUNT (*) FROM OLD TABLE(
   DELETE FROM NODE n WHERE EXISTS (SELECT * FROM NODE_LIST nl WHERE nl.ID = n.ID)
);