如果一个查询正在删除相同数量的记录,那么它将比多个查询运行得更快

时间:2014-01-22 13:34:17

标签: sql

我有一张这样的表:

Table company
companyid | companyname | owner |
5         |coffecompany |Mike   |
6         |juicecompany |Mike   |

出于某种原因,我需要使用它:

DELETE FROM company WHERE companyid='5';
DELETE FROM company WHERE companyid='6';

而不是

DELETE FROM company WHERE owner='Mike';

但是我想知道第二种选择是否运行得更快,如果它运行得更快,它会运行得更快吗?将来,我可能不得不用它来删除大量的记录,所以我真的需要知道。

4 个答案:

答案 0 :(得分:4)

delete from company where companyId in (5, 6);应该总是更快,即使例如差异可以忽略不计。你有适当的索引,没有并发查询,没有锁定等问题。

请注意,我的查询是针对MS SQL的,如果您的数据库服务器允许使用相同的构造(即以这种简洁的方式指定所有值),您应该使用它,如果不是,请使用{{1另外,如果delete from company where companyId = 5 or companyId = 6;是一个数字(表格列实际上是数字还是文本?),请不要使用字符串文字。

在任何情况下,它都会为服务器提供更多实现实际操作的方法,而DB服务器往往非常擅长查询优化。

但是,可以在事务日志中使用一个可能的删除瓶颈。如果你一次删除大量的行,那么最好在单独的事务中做一些单独的删除以适应事务大小限制。

答案 1 :(得分:1)

通常,SQL是对数据集进行操作的语言,因此对于大量行,第二次查询会更快。

首选可能会慢一些,因为您必须多次发送查询文本,因为您要删除行。如果要删除1 000 000行,请想象网络流量。

在少量行上,您可能无法看到任何差异。

答案 2 :(得分:0)

如果您使用的是Oracle,请考虑使用绑定变量:

立即执行'DELETE FROM company WHERE companyid =:ID'USING 6;

但除此之外,您的问题没有具体的答案,您需要自己进行基准测试,这取决于数据量,索引等...

答案 3 :(得分:0)

在查询中使用Where子句时,RDBMS将查找应用该条件的结果集。
通常,RDBMS将执行全表扫描以查找结果集,这意味着将调查任何记录以查看条件是否匹配。
根据表格尺寸耗费时间。

当where条件中列出的列被索引时,上述方法将有所不同 索引是一种对多个字段中的多个记录进行排序的方法。在表中的字段上创建索引会创建另一个数据结构,该结构保存字段值,并指向与其相关的记录。然后对该索引结构进行排序,允许对其执行二进制搜索。

作为简化示例:
包含N条记录的表A的字段T上的线性搜索(全表扫描)将需要平均N / 2次访问才能找到值。
如果'A'字段被索引,则排序的二进制搜索将需要平均log2 N块访问。
假设N=1,000,000那么我们将

N/2 = 500,000 
log2 1000000 = 19.93 = 20

我们可以立即看到这是一个巨大的进步。

看起来companyid是公司表的主键,如果是这样,RDMS会自动索引任何主键列,搜索将比owner搜索更有效。