ORACLE下不支持MySQL上的这种写法,但是不知道其他写法效率上的区别,所以有了这次尝试
--MySql支持的写法
INSERT DELAYED INTO TB_LOG_TEST (column1, column2, column3) VALUES
('1', '1', 1),
('2', '2', 1)
本次测试在Oracle19C版本下进行
首先建立好测试用表,这里的uuid和时间都是默认的,后续的插入过程就不需要写这两个字段
create table TB_LOG_TEST
(
uuid RAW(32) default sys_guid() not null,
insert_time DATE default sysdate not null,
column1 VARCHAR2(50) not null,
column2 VARCHAR2(50) not null,
column3 NUMBER not null
)
alter table TB_LOG_TEST
add constraint PK_TB_LOG_TEST_A primary key (UUID)
确定好表结构,用c#生成两种写法同时插入100行,1000行的SQL语句,具体写法如下
static void Main(string[] args)
{
StringBuilder sb1= new StringBuilder();
StringBuilder sb2 = new StringBuilder();
sb1.Append("INSERT ALL ");
sb2.Append("INSERT INTO tb_log_test(COLUMN1, COLUMN2, COLUMN3)");
for (int i = 0; i < 1000; i++)
{
string row1 = string.Format(@" into tb_log_test(COLUMN1, COLUMN2, COLUMN3) values('{0}', '{0}', {0}) ", i);
string row2 = string.Format(@" select '{0}','{0}',{0} from dual union all ", i);
sb1.Append(row1);
sb2.Append(row2);
}
sb1.Append(" select 1 from dual");
sb2.Remove(sb2.Length - "union all ".Length, "union all ".Length);
string sql1 = sb1.ToString();
string sql2 = sb2.ToString();
}
生成完SQL保存到TXT中,给大家看一下SQL长度,写法1是INSERT ALL写法,长度在100行时长度是7K左右,写法2是SELECT UNION ALL写法,长度是4K


到数据库执行查看执行时间花费


100条两种写法耗时都很少,差别也太小,所以接下来上1000行看看,这时候长度写法1是71K,写法2是46K


长度上的差别拉开了,写法2短了接近一半,接下来看看耗时


耗时方面也是写法占2优
总结
在ORACLE下面需要语句SQL插入多行时,优先选择SELECT UNION ALL 写法,耗时,长度都有不小的优势。
本次测试结果仅供参考,欢迎各位讨论,提出自己的看法