sql insert into语句优化方法

 代码如下 复制代码

insert into table value('a','b');
...
insert into table value('m','n'); 

 
但是由于每进行一次insert into 都会对数据库进行一次I/O操作,所以导致这样的循环插入方式变的非常慢
所以,可以使用一条insert into进行批量插入

 代码如下 复制代码

insert into table values('a','b'),('c','d'),('e','f')...('m','n'); 

上面只是最简单的方法下面再看

说明:tb_order_detail_his :7000W记录
  tb_order_detail     :2000W记录

 优化前:

 代码如下 复制代码
INSERT INTO /*+ append */  tablename_his
SELECT *  FROM  tablename  PARTITION (TB_ORDER_DE_WAREID40) WHERE ID NOT IN (
SELECT tcc.id FROM  tablename  PARTITION (TB_ORDER_DE_WAREID40) tcc , tablename_his  tcch WHERE tcc.id=tcch.id
)

在做数据归档时,需要做大数据量的insert,对于insert内容少还是可以胜任的,可当要把200多万的数据归档,2个小时都没有成功,
于是对其优化改造,利用append,parallel,分批处理,nologging方法,使这个200W的数据归档在15分钟就完成

优化后:
通过 mod(tcc.id,10)把内容分10部分提交归档

 代码如下 复制代码

INSERT INTO /*+ append */ tablename_his
SELECT  *  FROM tablename PARTITION (TB_ORDER_DE_WAREID40) tcc  WHERE  NOT EXISTS (
SELECT /*+ parallel(tcch,7) parallel(tcc,7) */ tcch.id FROM tablename_his tcch WHERE tcc.id=tcch.id
) AND mod(tcc.id,10)=9

1. 增加hint /*+ append */                                           --不用在高水位下查找可insert的空间,直接在高水位之上insert
2. 增加hint /*+ parallel(tab,4) */
   或者alter session enable/disable parallel dml;         ---充分利用系统硬件资源
3. alter table tablename nologging/logging               ----关闭表的log服务,减少redo产生
4. 如果业务允许的话,可以先删除索引,insert之后再重建.   ---减少在insert时维护索引的开销
5. 可以增加临时中间表                                                    ----减少此事务对undo的使用
6. 增大sort_area_size或PGA                                       ----增加排序空间,避免磁盘操作
7. 优化sql语句本身
8. pl/sql批处理                                                              ---化整为零,把大事务变成零散的小事务

注:能用一句sql,千万别用2句sql

时间: 2024-09-15 10:55:19

sql insert into语句优化方法的相关文章

sql insert select语句的使用方法

sql insert select语句的使用方法 INSERT 语句中的 SELECT 子查询可用于将一个或多个其它的表或视图的值添加到表中.使用 SELECT 子查询可同时插入多行. 下面的 INSERT 语句将 titles 中数据的 type 是 modern cooking 的所有行的数据插入到一个单独的表中: USE pubsINSERT INTO MyBooks   SELECT title_id, title, type   FROM titles   WHERE type = '

SQL 语句优化方法30例_Mysql

1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如: SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BS

SQL语句优化方法30例(推荐)

1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如: SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BS

三十种SQL语句优化方法(1/4)

1. /*+all_rows*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: select /*+all+_rows*/ emp_no,emp_nam,dat_in from bsempms where emp_no='scott'; 2. /*+first_rows*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如: select /*+first_rows*/ emp_no,emp_nam,dat_in from bs

SQL INSERT INTO 语句用法

INSERT INTO 语句用于向表格中插入新的行. INSERT INTO 表名称 VALUES (值1, 值2,....) 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) LastName FirstName Address City Carter Thomas Changan Street Beijing INSERT INTO Persons VALUES ('Gates', 'Bill'

PHP 函数,文件,sql 语句优化方法

.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个url文件时候的php教程版本问题: <?php echo file_get_contents("test.txt"); ?> file_get_contents() 函数把整个文件读入一个字符串中. 和 file() 一样,不同的是 file_get

SQL Server集成服务语句优化经验分享

SQL Serverhttp://www.aliyun.com/zixun/aggregation/14194.html">集成服务(SQL Server Integration Services,SSIS)在其前辈DTS(Data Transformation Services,数据转换服务)的基础上进步了不少,从可用性.性能和并行等方面来说,它已经成长为一个企业级ETL(Extraction, Transformation and Loading,抽取.转换和加载)产品,除了是一个ET

SQL Server 游标语句 声明/打开/循环实例_MsSql

SQL Server游标语句使用方法: 复制代码 代码如下: --声明一个游标 DECLARE MyCursor CURSOR FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo//定义一个叫MyCursor的游标,存放for select 后的数据 --打开一个游标 OPEN MyCursor//即打开这个数据集 --循环一个游标 DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(

SQL Server 游标语句 声明/打开/循环实例

SQL Server游标语句使用方法: 复制代码 代码如下: --声明一个游标 DECLARE MyCursor CURSOR FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo//定义一个叫MyCursor的游标,存放for select 后的数据 --打开一个游标 OPEN MyCursor//即打开这个数据集 --循环一个游标 DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(