基于Oracle设置的插入与基于集合的合并性能

时间:2016-12-07 17:03:11

标签: sql oracle performance

我们目前在没有Enterprise的情况下使用Oracle 11g(不幸的是不是一个选项)。

我们假设我有一个表格,其中包含一个常数(比如说2000个)数据行。我们称之为data_source。

我想将此表的一些列插入另一个表data_dest。我使用了源表中的所有记录。

换句话说,我想插入此集

            If Not IsDBNull(DataGridView2.Rows(0).Cells(4).Value) Then
                datagrid1.Value = DataGridView2.Rows(0).Cells(4).Value
            End If

在这种情况下哪个会更快:

select data_source.col1, data_source.col2, ... data_source.colN 
from data_source

OR

insert into data_dest
  select data_source.col1, data_source.col2, ... data_source.colN 
  from data_source

编辑1: 我们可以假设插入没有主键违规。 换句话说,我们可以假设insert将成功插入所有行,因此将合并。

1 个答案:

答案 0 :(得分:1)

insert很可能更快,因为它不需要在两个表上进行连接。

那就是说,两个查询不等同。假设col1被定义为主键,如果insert包含data_source中已存在于col1中的值,则data_dest将引发错误。由于merge正在比较两个表中的数据,因此只插入不存在的行,因此不会抛出主键违规行为。

insert等效的merge将是:

INSERT INTO data_dest
   SELECT data_source.col1, data_source.col2, ... data_source.colN
   FROM   data_source
   WHERE  NOT EXISTS
             (SELECT *
              FROM   data_dest
              WHERE  data_source.col1 = data_dest.col1)

insert的计划可能与merge的计划非常相似(如果不相同),并且性能无法区分。