【问题标题】:Maximum values possible in a WHERE IN queryWHERE IN 查询中可能的最大值
【发布时间】:2011-08-11 13:21:26
【问题描述】:

我有一个包含超过 3000000 个条目的表,我需要删除其中的 500000 个具有给定 ID 的条目。 我的想法是创建如下查询:

DELETE FROM TableName WHERE ID IN (id1, id2, ...........)

我使用简单的 C# 代码生成。 问题是: 我可以在 ID 数组中设置多少个值有限制吗?

如果有人有更好的方法来更有效地实现此删除,我愿意接受想法。

【问题讨论】:

  • 嗯...它没有足够的内存来处理该查询
  • 你的 C# 代码如何确定 id 列表?如果可以在 T-SQL 中将其指定为 where/have 子句和/或子查询的组合,这可能是更好的方法。
  • C# 代码正在从数据源(XML 文件)中提取 id,所有这些都有条件。

标签: sql-server-2008 sql-delete where-in


【解决方案1】:

如果您的 ID 无法通过任何比较来确定(如 WHERE ID < 1000000),您可以

  1. INSERT 将它们放入具有多个插入的临时表中,然后
  2. JOIN这个临时表给你的

但是插入可能会出现问题。你应该检查一下。你怎么能加快这件事?

  1. 批量删除
  2. 将 ID 插入临时表 in bulks

【讨论】:

  • 如果您只是删除所有小于 1000000 的 id,我完全不明白您为什么要引入临时表。
  • 所以我认为它不应该是一个 ID 列表,而应该是一个 ID 范围 列表。
  • @Martin:我说过当 ID 不能通过一些简单的比较来确定时......不能。
  • @Robert - 所以你做到了!我的错!
  • 我真的不明白添加临时表会如何缩短它所花费的时间....创建临时表/在现有表上加入/然后删除.....虽然我一直有我要删除的 ID 列表(主键)
【解决方案2】:

最后,我的解决方案还不错: 1.对ID进行排序(以节省服务器分页) 2. 使用 C# 代码查询创建,其中包含 500 个 ID。 3.一一发送查询。

我假设当我处理具有 1000 多个 id 的查询时,sql server 处理查询的时间减慢了我的速度(毕竟你在 sql server 中运行的所有查询都在处理和优化)。

我希望这对某人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2019-10-09
    • 1970-01-01
    • 2016-10-30
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多