暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 插入值每次执行会生成多个行

askTom 2018-07-26
539

问题描述



这是tkprof的剪断。

SQL ID: 4wgb411d8s7ss Plan Hash: 0

INSERT INTO QP_NPREQ_LINE_ATTRS_TMP (LINE_INDEX, ATTRIBUTE_LEVEL, 
  ATTRIBUTE_TYPE, CONTEXT, ATTRIBUTE, VALUE_FROM, VALIDATED_FLAG, 
  APPLIED_FLAG, PRICING_STATUS_CODE, PRICING_ATTR_FLAG ) 
VALUES
 (:B1 , :B10 , :B2 , :B3 , :B4 , :B5 , :B6 , :B9 , :B8 , :B7 )


call     count       cpu    elapsed       rows
------- ------  -------- ---------- ----------
Parse        6      0.00       0.00          0
Execute   5556     16.99      25.67     234460
Fetch        0      0.00       0.00          0
------- ------  -------- ---------- ----------
total     5562     16.99      25.67     234460
复制


(我仔细删除了磁盘,查询和当前列,以帮助澄清)。

所以5,556执行-234,460行。这怎么可能?AWR显示相同的情况-每单行插入42行。

我应该提到QP_NPREQ_LINE_ATTRS_TMP是一个简单的视图,它链接到QP_PREQ_LINE_ATTRS_TMP_T2-这是一个GTT。

如果在SQL * Plus或匿名PL/SQL块中进行插入,则每个插入会获得一行。

有什么想法吗?

未修改的snip如下。它包裹着。

感谢和问候

伊恩

SQL ID: 4wgb411d8s7ss Plan Hash: 0

INSERT INTO QP_NPREQ_LINE_ATTRS_TMP (LINE_INDEX, ATTRIBUTE_LEVEL, 
  ATTRIBUTE_TYPE, CONTEXT, ATTRIBUTE, VALUE_FROM, VALIDATED_FLAG, 
  APPLIED_FLAG, PRICING_STATUS_CODE, PRICING_ATTR_FLAG ) 
VALUES
 (:B1 , :B10 , :B2 , :B3 , :B4 , :B5 , :B6 , :B9 , :B8 , :B7 )


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        6      0.00       0.00          0          0          0           0
Execute   5556     16.99      25.67       5002      92404    2589462      234460
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     5562     16.99      25.67       5002      92404    2589462      234460
复制

专家解答

这可能是一件好事-这意味着有人正在使用基于数组的操作来有效地插入多行。这是PLSQL中的一个示例

SQL> create table t ( x int );

Table created.

SQL>
SQL> alter session set sql_trace = true;

Session altered.

SQL> declare
  2    type numlist is table of int
  3      index by pls_integer;
  4    r numlist;
  5  begin
  6    for i in 1 .. 100 loop
  7       r(i) := i;
  8    end loop;
  9
 10    forall i in 1 .. 100
 11      insert into t values (r(i));
 12  end;
 13  /

PL/SQL procedure successfully completed.

INSERT INTO T
VALUES
 (:B1 )


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          1          8         100
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0          1          8         100
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论