Mysql 使用SQL查询从表中删除区块中的大量记录

Mysql 使用SQL查询从表中删除区块中的大量记录,mysql,sql,sql-server,sql-delete,Mysql,Sql,Sql Server,Sql Delete,我有一个包含500多万条记录的表 我需要删除300000条记录,但我不能使用表的复合键。 必须使用列Price\u VERSION\u SEQ进行删除。我想在内部查询中使用fetchfirst50000行来删除数据块。但我不确定在主查询的Where子句中使用什么 请帮助。应该用什么来替换**** DELETE FROM Price_TBL where **** in (Select * from Price_TBL where Price_VERSION_SEQ=1 fetch first 5

我有一个包含500多万条记录的表 我需要删除300000条记录,但我不能使用表的复合键。 必须使用列
Price\u VERSION\u SEQ
进行删除。我想在内部查询中使用fetchfirst50000行来删除数据块。但我不确定在主查询的Where子句中使用什么

请帮助。应该用什么来替换****

DELETE FROM Price_TBL where **** in 
(Select * from Price_TBL where Price_VERSION_SEQ=1 fetch first 50000 rows only);
表格中的列为:

Price_GRP_VAR_COD
Price_VERSION_SEQ
Price_MP_OPER_COD
Price_FROM_MPM_RT
Price_FROM_MPM_RT1
复合键

Price_GRP_VAR_COD
Price_VERSION_SEQ
Price_MP_OPER_COD 

您可以按顺序用所有列替换
***
。我认为更简单的方法是只选择键:

DELETE FROM Price_TBL where (Price_GRP_VAR_COD, Price_VERSION_SEQ, Price_MP_OPER_COD) in 
(Select Price_GRP_VAR_COD, Price_VERSION_SEQ, Price_MP_OPER_COD from Price_TBL where Price_VERSION_SEQ=1 fetch first 50000 rows only);

我建议使用相关列
价格\u版本\u SEQ

DELETE FROM Price_TBL 
WHERE Price_VERSION_SEQ IN
(
    SELECT Price_VERSION_SEQ
    FROM Price_TBL
    WHERE Price_VERSION_SEQ=1
    FETCH FIRST 50000 ROWS ONLY
);

使用子选择查找50000:th Price_VERSION_SEQ值。在
DELETE
WHERE
子句中使用该值

DELETE FROM Price_TBL
   where Price_VERSION_SEQ <= (Select Price_VERSION_SEQ from Price_TBL
                               order by Price_VERSION_SEQ
                               offset 50000 fetch first 1 rows only);
从价格中删除\u TBL

在Price_VERSION_SEQ中,我不相信分割删除是解决问题的最佳方法,但也许你有很好的理由这么做。您是否尝试过一次删除所有内容?如果由于某些内存设置而失败,所需的重新配置是否不可行?只是一些值得思考的东西。我得到了超时错误,因为分配给我的资源是有限的。而且不能增加。因此,我唯一的选择就是分割查询并避免超时。Price\u VERSION\u SEQ是否已编制索引?如果是,请使用该列,否则请选择另一个索引列。顺便问一下,您使用的是MySQL还是SQL Server?(是否有任何一个支持FETCH FIRST语法?!?)不涉及标记产品。我们可以使用多个由“,”分隔的参数吗?我不认为上述查询在语法上是正确的。忘记了
Price\u GRP\u VAR\u COD、Price\u VERSION\u SEQ、Price\u MP\u OPER\u COD
周围的括号。尝试更新的语句。哦,我对subselect的语法一点也不确定。既然你没有问过这个问题,我想它可以在你的数据库管理器上运行。