插入和不存在插入之间的性能差异

时间:2019-05-05 08:10:34

标签: sql oracle query-optimization sql-insert

我知道,使用不存在插入要比插入更好,因为它会导致记录重复或唯一的键冲突问题。 但是就性能而言,这会带来很大的不同吗?

INSERT WHERE NOT EXISTS将在内部触发额外的SELECT语句以检查记录是否存在。如果是大表,建议使用INSERT vs INSERT WHERE NOT EXITS吗? 有人请解释两者之间的执行成本差异。

3 个答案:

答案 0 :(得分:0)

大多数Oracle IN子句查询涉及一系列文字值,并且当存在表时,标准联接会更好。在大多数情况下,Oracle基于成本的优化器将为IN vs EXISTS创建相同的执行计划,因此查询性能没有差异。

Exists关键字的计算结果为true或false,但是IN关键字将比较相应子查询列中的所有值。如果您使用IN运算符,则SQL引擎将扫描从内部查询中获取的所有记录。另一方面,如果我们使用的是EXISTS,则SQL引擎会在找到匹配项后立即停止扫描过程。

当我们要显示两个表中都有匹配列的所有行时,将使用EXISTS子查询。在大多数情况下,可以使用标准联接重新编写此类子查询,以提高性能。

当子查询结果非常大时,EXISTS子句比IN快得多。相反,当子查询结果非常小时,IN子句比EXISTS快。

此外,IN子句不能将任何具有NULL值的内容进行比较,但是EXISTS子句可以将具有NULL值的所有内容进行比较。

答案 1 :(得分:0)

这不是“最快”的问题,而是“正确”的问题。

INSERT插入表(无任何限制)时,您只需将记录添加到该表中。如果已经有一个现有的相同记录,那么将导致现在有两个这样的记录。根据您的需要(**),这可能很好,也可能是一个问题。

在将WHERE NOT EXISTS()添加到INSERT结构中时,系统只会将尚未添加的记录添加到表中,从而避免了以多个相同的记录结尾的情况。

(**:假设您对目标表有唯一或主键约束,那么重复记录的INSERT将导致UQ / PK违规错误。 IF 您的问题是:“最快的方法:尝试插入该行,并且如果存在这样的错误,则将其忽略而不是尝试在不存在的位置插入该错误并避免该错误”,那么我无法给出结论性的答案,但我可以肯定但是,我可以说的是WHERE NOT EXISTS()方法在代码中看起来会更好,并且(重要!)对于基于集合的操作也可以使用,即使只有1条记录也会导致问题,整个集的try / catch方法仍将失败。)

答案 2 :(得分:0)

INSERT将对照任何现有的模式约束,PK,FK,唯一索引,而不是空值和任何其他自定义约束来检查插入的数据-无论表模式需要什么。如果这些检查都可以,则将插入该行并循环到下一行。

在不存在插入的情况下,在进行上述检查之前,将对照表中所有行的数据检查行中所有列的数据。即使1列不同,也可以,然后将按照上面的INSERT继续进行。

对性能的影响主要取决于: 1.表中的现有行数 2.行的大小

因此,随着表变大,然后行大小变大,差异也随之增加。