数据库
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)
);
答案 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并显着提高我们的表现。