我有一张这样的表:
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';
但是我想知道第二种选择是否运行得更快,如果它运行得更快,它会运行得更快吗?将来,我可能不得不用它来删除大量的记录,所以我真的需要知道。
答案 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
搜索更有效。