在一个存储过程中,我用到了批量插入
就是insert int A select a from b 这种样子的
注意一点的是,这个批量插入的sql是动态sql,
我先拼出来的,然后用execute immediate来执行这个sql
在执行存储过程中很慢
但是我把这个sql语句取出来
拿到pl/sql中来单独执行
速度马上就上去了简单一句话,同一个sql在存储过程中很慢
但是在pl/sql中则很快请问这可能是什么原因造成的?
如何获取该条sql执行的时候的执行计划?
就是insert int A select a from b 这种样子的
注意一点的是,这个批量插入的sql是动态sql,
我先拼出来的,然后用execute immediate来执行这个sql
在执行存储过程中很慢
但是我把这个sql语句取出来
拿到pl/sql中来单独执行
速度马上就上去了简单一句话,同一个sql在存储过程中很慢
但是在pl/sql中则很快请问这可能是什么原因造成的?
如何获取该条sql执行的时候的执行计划?
2、使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量
insert /*+ append */ into A nologging select * from b;
用这个.
具体怎么使用Google一下吧.
我用了insert /*+ append */ into A select a from b
但是速度还是慢虽然各位说了很多
但是还是没有说到怎么在执行存储过程中查找它的执行计划
这才是我最关心的谢谢hailang1118
你这个建议,我正在试
恩,分开并行插入,质量会提高很多,建议不开始REDO OR UNDO文件,增加数据插入效率。。
tangren大大:
insert /*+ append */ into A nologging select * from b -- 这句不能实现NOLOGGING ,我查了基本所有的ORACLE的官方文件,都没有NOLOGGING的写法,而表的UNLOGGING默认是取决于DATASPACE,当然也可以手动的修改表的NOLOGGING。 ALTER TABLE ... OR CREAT TABLE... 时进行NOLOGGING的修改。
不足之处望回答。。
你加个步骤
alter table a nologging
请问,我该如何写hints
让动态sql的执行计划和这个在pl/sql中的执行计划保持一致?
示例如下:先根据sql语句查找sql_id
select *
from V$SQLAREA sr
where sr.SQL_TEXT like 'INSERT INTO T_BILLINVOICEDETAIL%'
order by sr.FIRST_LOAD_TIME desc;--再根据sql_id查找执行计划
select * from V$SQL_PLAN pa where pa.SQL_ID = '6c8y8nuysajcf';
或者下面这个更直观些:select '--------------------------------------------------------------------------------'
from dual
union all
select '| Operation | PHV/Object Name | Rows | Bytes| Cost |' as "Optimizer Plan:"
from dual
union all
select '--------------------------------------------------------------------------------'
from dual
union all
select *
from (select rpad('|' || substr(lpad(' ', 1 * (depth - 1)) || operation ||
decode(options, null, '', ' ' || options),
1,
62),
63,
' ') || '|' ||
rpad(decode(id,
0,
'----- ' || to_char(hash_value) || ' -----',
substr(decode(substr(object_name, 1, 7),
'SYS_LE_',
null,
object_name) || ' ',
1,
20)),
21,
' ') || '|' ||
lpad(decode(cardinality,
null,
' ',
decode(sign(cardinality - 10000),
-1,
cardinality || ' ',
decode(sign(cardinality - 1000000),
-1,
trunc(cardinality / 1000) || 'K',
decode(sign(cardinality - 1000000000),
-1,
trunc(cardinality / 1000000) || 'M',
trunc(cardinality / 1000000000) || 'G')))),
7,
' ') || '|' ||
lpad(decode(bytes,
null,
' ',
decode(sign(bytes - 1024),
-1,
bytes || ' ',
decode(sign(bytes - 1048576),
-1,
trunc(bytes / 1024) || 'K',
decode(sign(bytes - 1073741824),
-1,
trunc(bytes / 1048576) || 'M',
trunc(bytes / 1073741824) || 'G')))),
6,
' ') || '|' ||
lpad(decode(cost,
null,
' ',
decode(sign(cost - 10000000),
-1,
cost || ' ',
decode(sign(cost - 1000000000),
-1,
trunc(cost / 1000000) || 'M',
trunc(cost / 1000000000) || 'G'))),
8,
' ') || '|' as "Explain plan"
from v$sql_plan
where SQL_ID='6c8y8nuysajcf')
union all
select '--------------------------------------------------------------------------------'
from dual;至于如何强迫变更执行计划,再继续探索!