Sql 如果在执行删除之前进行选择计数,或者只是盲目地调用delete,那么这样做更好吗?

Sql 如果在执行删除之前进行选择计数,或者只是盲目地调用delete,那么这样做更好吗?,sql,mysql,database,kettle,Sql,Mysql,Database,Kettle,我正在寻找一个最佳实践/想法,看看在调用delete之前是否最好进行select计数并检查结果是否大于0,或者是否最好在数据库中盲目地触发delete语句,即使数据不存在。在我们的情况下,大多数时间数据都不存在 那么什么更好呢 Option 1: call Select Count(X) where foo, if result > 0, delete where foo 或 我倾向于盲删除的原因是速度的原因,因为你正在做一个表击中无论如何 编辑:这实际上是在kettle(一个ETL工具

我正在寻找一个最佳实践/想法,看看在调用delete之前是否最好进行select计数并检查结果是否大于0,或者是否最好在数据库中盲目地触发delete语句,即使数据不存在。在我们的情况下,大多数时间数据都不存在

那么什么更好呢

Option 1: call Select Count(X) where foo, if result > 0, delete where foo

我倾向于盲删除的原因是速度的原因,因为你正在做一个表击中无论如何


编辑:这实际上是在kettle(一个ETL工具)中发生的,因此如果有删除,这三个操作将完全分开完成。因此,完全使用SQL是不可取的

只需执行删除操作。事先发出count(*)没有任何好处。

我只会删除,如果您试图删除不存在的内容,它只会删除0(零)行。这也减少了对数据库的访问量。

我会说我会盲目地删除,然后返回受影响的行数。
在这两种情况下,进行比较时,执行时间应该几乎相同。

通用it答案的开头是“它取决于”

这里取决于Delete的查询计划

如果您执行使用索引或更好的查询计划的EXISTS查询(每个OMG Ponies),速度会更快


使用表扫描的不必要的删除可能会被避免。

如果您在生产数据库中,不要做这种工作(哦,是的,他们让我做过一次)。如果您在开发中,我将使用选项2。两个where子句将完全相同,我认为他们应该在没有索引或表扫描时使用相同的索引或表扫描。是的,如果select与delete相同,我同意。我没有充分表达的是:如果您了解数据的结构,您可能能够使用更好的查询计划编写具有相同结果的查询。
Option 2: delete where foo