DB2中从表和子选择中删除行的最佳方法是什么?

时间:2018-03-06 20:28:39

标签: sql db2 common-table-expression dashdb

数据库

db2的

方案

我有以下代码,其中在NODE表上我有大约135k行和NODE_LIST公共表,其中有大约4k行,并且删除NODE中可以在NODE_LIST中找到的所有行大约需要48秒。

我想运行查询,以便在5秒内完成。

  

此外,我注意到,当我向NODE表添加更多节点时,其效率可能会降低。

当前解决方案

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

2 个答案:

答案 0 :(得分:0)

您要删除的node_id是否通过NODE表随机分布?您是否可以使用群集索引来减少每次都删除node_id的页面数。 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.dbobj.doc/doc/c0061098.html或使用MDC表https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.partition.doc/doc/c0007201.html

答案 1 :(得分:0)

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

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

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

使用IBM Data Server Manager我们创建了一个解释计划,帮助我们应用正确的INDEX并显着提高我们的表现。