我们目前在没有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将成功插入所有行,因此将合并。
答案 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
的计划非常相似(如果不相同),并且性能无法区分。