oracle 中 insert select 和 select insert 配合使用
Insert Into select 与 Select Into 哪个更快?
在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SELECT INTO ;
那么二者语法上有什么区别?性能上又如何呢?
围绕着这两个问题,今天就来总结对比下:
一:语法区别
1: INSERT INTO SELECT 的语法
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
如果两个表的结构一致,字段类型一致:
INSERT INTO table2
SELECT * FROM table1;
如果两个表结构不一致,只有某几列一致:
INSERT INTO table2 (column_name)
SELECT column_name FROM table1;
2:SELECT INTO 的语法
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
如果想要复制所有的列:
SELECT *
INTO newtable
FROM table1;
如果想要复制部分的列:
SELECT column_name
INTO newtable
FROM table1;
提示:新表将会使用 SELECT 语句中定义的列名称和类型进行创建。如果想要修改字段的名称,可以使用 AS 子句来应用新名称。
二:性能区别
----创建一个基础数据库
CREATE TABLE TestDataTable(
id int not null,
userName varchar(20),
remark varchar(100)
)
----填充100W测试数据
DECLARE @id INT,@userName NVARCHAR(50),@remark NVARCHAR(50);
DECLARE @i INT;
SET @id=0;
SET @userName ='';
SET @remark='';
SET @i=0;
WHILE @i<1000000
BEGIN
SET @id=@i;
IF(@i%2=0)
begin
set @userName='二狗子';
set @remark='SELECT INTO 最快!'
end
else
begin
set @userName='李四';
set @remark='快你妹,INSERT INTO 最快'
end
INSERT INTO TestDataTable(id,username,remark)
VALUES (@id,@username,@remark )
SET @i=@i+1
END
<br>--查询填充后的数据
SELECT * FROM TestDataTable<br>--删除表结构以及数据【慎用】
DROP Table TestDataTable
耗时1分钟58秒,数据填充好了,真是不给力,竟然用了快2分钟;
好了,在去创建一个目标数据库;
--创建一个目标数据库,把100W数据复制到这个里面取
CREATE TABLE TargetDB(
id int not null,
userName varchar(20),
remark varchar(100)
)
测试1:INSERT INTO SELECT
SET STATISTICS TIME ON
INSERT INTO TargetDB
SELECT *
FROM TestDataTable
GO
SET STATISTICS TIME OFF
测试2:SELECT INTO
SET STATISTICS TIME ON
SELECT *
INTO TargetDB
FROM TestDataTable
GO
SET STATISTICS TIME OFF
三:结论
经过上面的对比,可以看出SELECT INTO 的性能要比INSERT INTO 快出不少;
虽然SELECT INTO 数据的导入速度有很大优势,但是也有不好的地方,就是此语句只能在目标表没有创建的情况下使用,如果目标表结构已经存在,就会提示数据库中已存在名为 'TargetDB' 的对象(如下图),此时就只能用INSERT INTO SELECT 方式去操作了。
注意
注意:
1:SELECT INTO FROM
如果在sql/plus或者PL/SQL执行这条语句,会报"ORA-00905:缺失关键字"错误,原因是PL/Sql与T-SQL的区别。
T-SQL中该句正常,但PL/SQL中解释是:
select..into is part of PL/SQL language which means you have to use it inside a PL/SQL block. You can not use it in a SQL statement outside of PL/SQL.
即不能单独作为一条sql语句执行,一般在PL/SQL程序块(block)中使用。
如果想在PL/SQL中实现该功能,可使用Create table newTable as select * from ...:
如: create table NewTable as select * from ATable;
NewTable 除了没有键,其他的和ATable一样
2:一般oracle中如果是原表向复制数据修改年度使用时 select insert 配合 insert select;
如果时本表复制其他表数据 insert select
oracle 中 insert select 和 select insert 配合使用的更多相关文章
- 将SQLServer2005中的数据同步到Oracle中
有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据.不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. ...
- SQLServer中的top、MySql中的limit、Oracle中的rownum
(1)在SQL Server中,我们使用 select top N * from tablename来查询tablename表中前N条记录. (2)在MySQL中,我们使用select * from ...
- oracle中 SELECT INTO 和INSERT INTO ... SELECT区别
在Oracle中,将一张表的数据复制到另外一个对象中.通常会有这两种方法:insert into select 和 select into from. 前者可以将select 出来的N行(0到任意数 ...
- sql: sybase与oracle中insert into select和select into的用法
1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...
- 问题:oracle select into;结果:oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解 (2011-07-08 08:59:47) 转载▼ 标签: it 分类: oracle 我们经常会遇 ...
- Oracle中复制表的方法(create as select、insert into select、select into)
转: Oracle中复制表的方法(create as select.insert into select.select into) 2018-07-30 22:10:37 小白白白又白cdllp 阅读 ...
- oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别
create table as select * from和insert into select from两种表复制语句区别 create table targer_table as select ...
- oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
我们经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INT ...
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
SELECT INTO和INSERT INTO SELECT的区别 数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Ta ...
随机推荐
- ruby 使用 rqrcode 生成二维码
参考: https://github.com/whomwah/rqrcode 1. gem 'rqrcode' 2. 在helper中: require 'base64' def generat ...
- jvm调优、常用工具
ps -ef | grep java查出进程id jmap -heap ID 查出jvm配置信息 加入参数:打印Gc日志,分析 GC日志分析工具: GCeasy 降低minor gc 和 full g ...
- Mysql数据库优化一:集群(读写分离)之主从服务器的安装与配置
Mysql数据库的集群(读写分离),说白了就是将读操作和写操作分开在不同的服务器上实现,以达到提高效率的目的. 大致原理如下: 数据库中的所有操作都是有日志记录的(前提是要打开这个日志记录功能) 1. ...
- 简单学习【1】——打包JS
webpack entry <entry> output webpack --config webpack.conf.js Step1:新建一个文件,里面有一个app.js 一个sum.j ...
- centos7 redis 6379端口telnet不通
1.查看redis服务是否启动,如图所示,redis已经启动 2.查看是否监听正确的ip和端口 发现问题:端口号6379没错,但是ip是127.0.0.1,表示只能本地访问,问题就出在这. 3.修改r ...
- 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)
RabbitMQ 面试题 1.什么是 rabbitmq 2.为什么要使用 rabbitmq 3.使用 rabbitmq 的场景 4.如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费 ...
- javascript数据结构
学习数据结构非常重要.首要原因是数据结构和算法可以很高效的解决常见问题.作为前端,通过javascript学习数据结构和算法要比学习java和c版本容易的多. 在讲数据结构之前我们先了解一下ES6的一 ...
- vue hover如何触发事件?
vue中并没有 @hover 事件,但是可以使用 @mouseenter 和 @mouseleave 来模拟hover操作.
- 关于ConfigurationSection自定义config的简单使用
1.1.自定义config结构(参考对应颜色标注),放到configuration根节点下: <test> <testInfos> <" /> <& ...
- 一个proc预编译代码时coredump的问题分析
最近有同事在搞编译环境迁移,碰上一个问题让我帮他看一下. 他建了一个新目录,然后把现在的代码拷过去,编译的时候发现有一个文件编译不了一执行就出现core,不知道啥情况. 我进到他的编译环境 ...