哪个更好,带有where子句的delete语句包含10,000或过滤器(例如从表中删除id = 1或id = 2或id = 3等)或执行10,000个删除语句(例如从表中删除id = 1;从表中删除id = 2;等)?该数据库是MS SQL Server。
修改
ID不是顺序的,并且没有where子句我可以用来捕获它们(例如id> 100和id< 50)因为我不知道这些ID是如何相关的(除了他们都来自同一张桌子。所以这真的是关于绩效的问题。
答案 0 :(得分:6)
您从哪里获取要删除的ID?肯定有这么多,他们在某个地方的数据库中。如果是这种情况,你可以这样做:
DELETE FROM MyTable
WHERE ID IN ( /* Select query that returns your 10000 IDs here */ )
如果他们不在数据库中,添加,即使这意味着创建一个表来保存它们只会存在足够长的时间来完成此操作。
答案 1 :(得分:2)
对于性能,最糟糕的方法是一次删除一行。但是,一次删除太多也会导致用户锁定和阻止问题。通常最好的选择是两者的混合,你一次删除一批(比如大约1000条记录)。
现在,当您考虑被删除的记录可能在另一个表中有子记录时,这会变得更加复杂。有些人通过级联删除执行删除操作,而其他人则从子表开始执行删除操作。这两种情况都可能意味着要删除的记录要多得多10000个,然后批量需要更小以避免锁定。在这种情况下,有些人可能希望一次执行一条记录,以确保在先删除现有子记录时失败,其他记录是不完整的,并且您知道哪些记录失败。对于记录的类型尤其如此,如果儿童记录的存在意味着您不应该让父母去除(您不能删除实际购买物品的客户或者财务记录全部搞砸了)。 / p>
答案 2 :(得分:1)
ID是顺序的吗?如果是这样,您可以运行以下SQL语句:
DELETE FROM table_name
WHERE ID BETWEEN id_lowest and id_highest;