我有一张包含9百万条记录的表格。我定期将此数据同步到第三方。我保留一个列,告诉某个特定行是否已经同步。
现在我需要删除几乎6 million
个已同步的行,我不确定是否正在运行
Model.where(:sync_flag => true).delete_all
会是一个好主意。每秒有数百个插入,我认为它可能导致以一种会伤害/阻止插入的方式锁定表(MySQL专家需要在此处更正)
通过上面的序言,我想到在循环中使用带限制子句的删除删除所有记录,直到没有留下但是使用以下
Model.where(:sync_flag => true).limit(5000).delete_all
它引发了异常delete_all doesn't support limit scope
。
是否有解决方法可以在不离开Rails环境的情况下解决问题?
答案 0 :(得分:2)
ActiveRecord::Base.connection.send(:delete_sql,'delete from <table name> where sync_flag = true limit 1000')
你必须使用send
,因为'delete_sql'受到保护,但这有效。
另一种解决方案可能是
Model.connection.exec_delete('DELETE FROM <table name> where sync_flag=true LIMIT 10000', 'DELETE', [])
它将返回受影响的行,并且还将通过rails logger记录查询。
答案 1 :(得分:1)
您可以尝试:
Model.where(:sync_flag => true).limit(5000).destroy_all
您可以在以下位置找到更多详情: http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-delete_all
答案 2 :(得分:1)
在这里执行SQL命令怎么样?
Model.connection.exec_delete('DELETE FROM models WHERE sync_flag = 1 LIMIT 5000', 'DELETE', [])