ORACLE 19C 数据库多行插入语句效率对比 INSERT ALL 与 INSERT SELECT UNION ALL

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

写法1长度
写法2长度

 

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

 

写法1耗时0.024s

 

写法2耗时0.013s

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

        

写法1一千行长度

 

写法2一千行长度

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

写法1一千行耗时0.86秒

 

写法2一千行耗时0.342秒

 耗时方面也是写法占2优

总结

在ORACLE下面需要语句SQL插入多行时,优先选择SELECT UNION ALL  写法,耗时,长度都有不小的优势。

本次测试结果仅供参考,欢迎各位讨论,提出自己的看法

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值