告诉我如何优化从Postgre表中删除数据我有一个这样的表:
CREATE TABLE IF NOT EXISTS test (
group varchar(255),
id varchar(255),
type varchar(255),
);
INSERT INTO test
(group, id, type)
VALUES
('1', 'qw', 'START'),
('1', 'er', 'PROCESS'),
('1', 'ty', 'FINISH');
INSERT INTO test
(group, id, type)
VALUES
('2', 'as', 'START'),
('2', 'df', 'PROCESS'),
('2', 'fg', 'ERROR');
INSERT INTO test
(group, id, type)
VALUES
('3', 'zx', 'START'),
('3', 'cv', 'PROCESS'),
('3', 'ty', 'ERROR');
INSERT INTO test
(group, id, type)
VALUES
('4', 'df', 'START'),
('4', 'gh', 'PROCESS'),
('4', 'fg', 'ERROR'),
('4', 'ty', 'FINISH');
| 组群|标识符|类型|
| - -|- -|- -|
| 一个|每周一次|启动|
| 一个|额|工艺流程|
| 一个|泰|表面处理|
| 2个|作为|启动|
| 2个|深度|工艺流程|
| 2个|fg值|错误信息|
| 三个|zx型|启动|
| 三个|CV值|工艺流程|
| 三个|泰|错误信息|
| 四个|深度|启动|
| 四个|生长激素|工艺流程|
| 四个|光纤陀螺仪|错误信息|
| 四个|泰|表面处理|
它包含由GROUP字段中的一个值组合的操作但并非所有操作都到达末尾,并且列表中没有值为FINISH的操作,但具有类型ERROR,如GROUP 2和GROUP 3的行此表为1 TB我想删除所有未以FINISH状态结束的操作链,优化此操作的最佳方法是什么?
我的程式码如下所示:
delete from TEST for_delete
where
for_delete.group in (
select group from TEST error
where
error.type='ERROR'
and
error.group NOT IN (select group from TEST where type='FINISH')
);
但是对于这样一个体积的盘子,我想它会慢得可怕,我能以某种方式改进我的代码吗?
2条答案
按热度按时间hm2xizp91#
EXISTS条件通常比IN条件更快,而
NOT EXISTS
几乎总是比NOT IN
更快,所以你可以这样尝试:xoefb8l82#
通常,在这种情况下,您应该使用MV(实体化视图)。您可以创建一个表,在其中保存需要删除的所有ID,并使用触发器保持同步。例如:
您知道您使用的系统和数据,也可以决定使用事件来保持数据表同步。使用MV,您可以使用更简单、更快速的方式来删除所有数据列:
对不起我的英语不好