【问题标题】:Delete large amount of records in chunk from a Table using SQL query使用 SQL 查询从表中删除大量记录
【发布时间】:2015-11-28 20:32:38
【问题描述】:

我有一个包含超过 500 万条记录的表 我需要删除 300000 条记录,但我不能使用表的复合键。 必须使用列Price_VERSION_SEQ 进行删除。我正在考虑仅在内部查询中使用获取前 50000 行来删除块中的数据。但我不确定在主查询的 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 

【问题讨论】:

  • 我不相信分割删除是解决问题的最佳方法,但也许你有充分的理由这样做。您是否尝试一次性删除所有内容?如果由于某些内存设置而失败,那么所需的重新配置是否不可行?只是一些思考的食物。
  • 我收到超时错误,因为分配给我的资源是有限的。而且不能增加。所以留给我的唯一选择就是划分查询并避免超时。
  • Price_VERSION_SEQ 是否已编入索引?如果是,则使用该列,否则选择另一个索引列。顺便提一句。您使用的是 MySQL 还是 SQL Server? (它们中的任何一个都支持 FETCH FIRST 语法吗?!?)不涉及取消标记产品。

标签: mysql sql sql-server sql-delete


【解决方案1】:

我建议使用相关专栏Price_VERSION_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
);

【讨论】:

    【解决方案2】:

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

    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);
    

    【讨论】:

    • 我们可以使用多个以“,”分隔的参数吗?我不认为上面的查询是正确的语法。
    • 忘记了Price_GRP_VAR_COD, Price_VERSION_SEQ, Price_MP_OPER_COD 周围的括号。尝试更新的语句。哦,我完全不确定子选择的语法。既然你没有问这个问题,我认为它适用于你的数据库管理器。
    【解决方案3】:

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

    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);
    

    未经测试,不知道它是否适用于 MySQL 和/或 SQL Server,但至少它是 ANSI SQL。

    顺便说一句,如果 OFFSET/FETCH FIRST 语法不起作用,我认为 MySQL 有 LIMIT 50000,1,而 SQL Server 有 SELECT TOP

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多