我的表有 17,000,000 行。我需要在某些条件下删除 500,000。此时我有一个 500,000 行的脚本看起来像
delete from table where name = 'John' and date = '2010-08-04';
delete from table where name = 'John' and date = '2010-08-05';
delete from table where name = 'Adam' and date = '2010-08-06';
一行执行了大约 2.5 秒。它太长了。如何提高速度?
答案 0 :(得分:3)
如果名称和日期字段没有索引,请尝试创建以下索引并尝试您的代码。
CREATE INDEX idx_table_name_date ON table (name, date)
如果可能,您还可以通过合并它们来最小化删除语句的数量。
代替
delete from table where name = 'John' and date = '2010-08-04';
delete from table where name = 'John' and date = '2010-08-05';
可以是:
delete from table where name = 'John' and date in('2010-08-04','2010-08-05');
答案 1 :(得分:3)
我建议您将要删除的行加载到表中并使用:
delete from table t
from todelete td
where t.name = td.name and t.date = td.date;
即使没有索引,这也应该比无数个单独的 delete
语句快。但您希望在 table(name, date)
上建立索引以提高性能。
如果数据已经来自表或查询,那么您可以直接使用它。
您还可以通过在 from
子句中显式列出值来将其合并到一个查询中:
delete from table t
from (values ('John', '2010-08-04'),
('John', '2010-08-05')
('Adam', '2010-08-06')
) todelete
where t.name = td.name and t.date = td.date;