SQL Plus vs Toad IDE-在SQL Plus中运行插入会花费更长的时间

|| 我正在运行这样的查询:
INSERT INTO TableA (colA, colB)
Select ColA, ColB 
from TableB
这是巨大的插入,因为它要查询200万行,然后将它们插入表中。我的问题是关于表现的。当我在蟾蜍中运行查询时,查询大约需要4-5分钟才能运行。 当我通过sqlplus运行查询时,它花费的时间更长。它已经运行了40分钟以上,尚未完成。我甚至通过关闭服务器输出来进行一些小的调整,以防影响性能。 关于通过sqlplus运行查询,我应该注意任何调优吗?有没有办法找出不同客户端执行/处理查询方式的差异? 注意:这是将数据从表A转移到表B的唯一方法。我已经研究了imp / exp和impdp / expdp,在我的情况下是不可能的。 蟾蜍-9.6.1.1版 SqlPlus-9.2.0.1.0 Oracle数据库-10克     
已邀请:
听起来好像还有其他事情。我的疯狂猜测是您的SQL * Plus会话被阻止了。您可以检查v $ lock来查看情况吗?有很多脚本/工具可以检查您的会话当前花费的时间。弄清楚,然后从那里去。我个人喜欢Tanel Poder的快照程序脚本(http://tech.e2sn.com/oracle-scripts-and-tools/session-snapper)。     
可能是一千件事。 (@John Gardner:这就是为什么我不是dba.stackexchange.com的忠实拥护者的原因之一-在您不知道答案之前,您将不知道它是编程问题还是DBA问题。我认为最好是我们都在一个站点上一起工作。) 这里有一些想法: 不同的会话设置-并行dml和并行查询可以启用,强制或禁用。查看您的登录脚本,或使用ѭ1look查看会话信息 一个锁,如@Craig建议的。尽管我认为查看ѭ2来识别锁更容易。 延迟的块清除将使第二个查询变慢。以
set autotrace on
运行。
db block gets
redo size
第二次可能更大(第二条语句需要做一些额外的工作,尽管这可能不足以解释时差)。 缓冲区高速缓存可以使第二个查询更快。以
set autotrace on
运行,
physical reads
可能会有很大差异。尽管有这么多的数据,但是很大一部分被缓存的机会可能很小。 其他会话可能会占用大量资源。看
select * from v$sessmetric order by physical_reads desc,logical_reads desc, cpu desc;
,或者看v $ sysmetric_history。 您可能需要考虑并行和附加提示。您可能可以使该查询的运行速度提高10倍(尽管该方法存在一些缺点,例如 数据最初无法恢复)。 另外,对于测试,您可能希望使用较小的尺寸。用诸如
and rownum <= 10000
之类的文字插入。性能调整非常困难,如果可以运行,它将很有帮助 经常陈述。总会有一些骗局,您想忽略离群值,但是仅凭两个样本就无法做到这一点。 您可以查看每次运行的一些详细统计信息,但您可能需要使用
INSERT /*+ GATHER_PLAN_STATISTICS */...
运行查询。然后运行此命令以找到sql_id:
select * from v$sql where sql_text like \'%INSERT%GATHER_PLAN_STATISTICS%\';
然后运行此命令以查看每个步骤的详细信息:
select * from v$sql_plan_statistics_all where sql_id = \'<sql_id from above>\';
(在11g中,可以使用v $ sql_monitor,或者甚至更好的dbms_sqltune.report_sql_monitor。)     
这是很明显的一点,但众所周知,它会使人绊倒...ѭ13上有任何索引吗?如果有的话,它们是否独一无二?如果是的话,在再次在SQL * Plus中运行Toad会话之前,是否提交或回滚了Toad会话?如@Craig所建议的,不这样做是获得阻止的一种简单方法。在这种情况下,它永远不会完成-您等待40分钟以上是因为它阻塞了第一行插入。 如果有任何索引,则最好在插入时删除它们,然后再重新创建它们,因为通常这样做的速度明显更快。     
正如其他人已经建议的那样,有很多事情可能导致选择/插入大量数据的语句执行不佳(并且不一致)。尽管我看到Toad有时会做些事情来提高性能,但我从未见过它能做得这么快,所以我倾向于认为它更多地与数据库而不是工具有关。 我会要求DBA在慢速语句运行时检查您的会话和数据库。他们应该能够为您提供一些提示-他们将能够检查任何问题,例如锁定或过多的日志文件切换。他们还可以跟踪两个会话(Toad和SQL Plus),以查看Oracle如何执行这些语句以及是否存在任何差异等。 取决于您正在执行的操作,它们甚至可以帮助您更快地运行插入。例如,禁用索引,插入然后重新构建可能会更快。或者可以暂时禁用日志记录。这显然取决于您的确切情况。     

要回复问题请先登录注册