create as & insert into 语句性能分析

1、会话设置

alter session set sql_trace=true;
alter session set tracefile_identifier='mysession'create table t2 as select * from t1;

2、格式化mysession生成的trace文件;

Plan Hash: 1069440229
create table t2 as select * from t1
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          1          0           0
Execute      1      0.06       0.06          1        423        927       80050
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.06       0.06          1        424        927       80050

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows     Row Source Operation
-------  ---------------------------------------------------
0  LOAD AS SELECT  (cr=555 pr=1 pw=377 time=0 us)
80050   TABLE ACCESS FULL T1 (cr=381 pr=0 pw=0 time=12148 us cost=109 size=7024522 card=88918)


insert into
SQL ID: 6xcqhqnm53x7g
Plan Hash: 3617692013
insert into t3 select * from t1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          1          0           0
Execute      1      0.12       0.22          2       1165       4334       80050
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.13       0.22          2       1166       4334       80050

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84


Rows     Row Source Operation
-------  ---------------------------------------------------
0  LOAD TABLE CONVENTIONAL  (cr=0 pr=0 pw=0 time=0 us)
1   TABLE ACCESS FULL T1 (cr=4 pr=0 pw=0 time=0 us cost=109 size=7024522 card=88918)

结果显示 insert into 相较create table而言在查询插入时所消耗的资源较高。

SQL中的`INSERT INTO`语句用于向数据库表中添加新的记录。这种语句提供了几种不同的方式来插入数据,具体取决于是否指定列名以及是从零开始创建记录还是从其他查询结果中复制数据。 ### 插入完整的行 如果希望向表中插入一条完整的记录,并且知道所有字段的值,可以使用以下语法: ```sql INSERT INTO table_name VALUES (value1, value2, value3,...); ``` 这种方法要求提供的值的数量顺序必须与表中列的数量顺序相匹配。 ### 插入特定列的值 当只需要为某些列提供值时,可以通过明确指定目标列来实现: ```sql INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...); ``` 这种方式更加灵活,因为它允许忽略那些具有默认值或者允许NULL值的列[^2]。 ### 从另一个查询结果插入数据 若需要将一个表中的数据复制到另一个表中,可以利用`INSERT INTO SELECT`结构: ```sql INSERT INTO table_name (column1, column2, column3,...) SELECT column1, column2, column3,... FROM another_table WHERE condition; ``` 此方法非常适合于基于现有数据集生成新数据集的情况,同时还能应用条件过滤以确保只复制满足特定条件的数据[^3]。 ### 示例 假设有一个名为`Websites`的表,它包含`name`、`country`等字段,而还有一个名为`apps`的表,其中含有`app_name`、`country``id`字段。要从`apps`表中选择`id=1`的记录并将其插入到`Websites`表中,可以这样写: ```sql INSERT INTO Websites (name, country) SELECT app_name, country FROM apps WHERE id = 1; ``` 以上例子展示了如何通过`INSERT INTO ... SELECT`的方式来进行跨表的数据迁移。 此外,在处理实时计算场景如Flink中,`INSERT INTO`也可以用来将处理后的结果输出到指定的结果表中,例如: ```sql -- 源表 CREATE TEMPORARY TABLE datagen_source ( name VARCHAR, score BIGINT ) WITH ( 'connector' = 'datagen' ); -- 结果表 CREATE TEMPORARY TABLE blackhole_sink( name VARCHAR, score BIGINT ) WITH ( 'connector' = 'blackhole' ); -- DML INSERT INTO blackhole_sink SELECT UPPER(name), score FROM datagen_source; ``` 这段代码演示了如何创建临时源表结果表,并使用`INSERT INTO`命令将转换后的数据(这里是对`name`字段应用了`UPPER()`函数)写入到黑洞连接器中,这在测试或丢弃数据时非常有用[^5]。 最后,了解表结构对于正确使用`INSERT INTO`至关重要。在MySQL中,可以通过`DESCRIBE table_name;`命令查看表的结构信息;而在SQL Server中,则可能需要使用`sp_columns`系统存储过程来获取类似的列信息[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值