insert append 操作的注意事项


昨晚做一个数据割接,将两张表的数据以 append 方式 插入到 A 表,割到一段时间之后,发现大量的TM 锁

HOLDER         SID        ID1        ID2      LMODE    REQUEST TYPE      CTIME      BLOCK    INST_ID
------- ---------- ---------- ---------- ---------- ---------- ---- ---------- ---------- ----------
holder:       2947     816780          0          6          0 TM           22          1          2
waiter        1120     816780          0          0          3 TM           22          0          2
waiter         890     816780          0          0          3 TM           22          0          2
waiter        1331     816780          0          0          3 TM           22          0          2
waiter        1653     816780          0          0          3 TM           22          0          2
waiter         345     816780          0          0          3 TM           22          0          2
waiter         646     816780          0          0          3 TM           22          0          2
waiter         730     816780          0          0          3 TM           22          0          2
waiter        1136     816780          0          0          3 TM           22          0          2
waiter        1731     816780          0          0          3 TM           22          0          2
waiter        2711     816780          0          0          3 TM           22          0          2

问题原因:
insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive), 其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),从下面截图中可以看出当时持锁者的mode 为 6, 这使其他DML在直接路径加载期间将被阻塞。 


下图是当时应用连接过来的会话对表 ord_t_item_repository 的 insert 操作
  JDBC Thin Client                                 16742                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16666                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35068                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35070                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35084                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16685                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 17239                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 17253                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35074                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35076                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16740                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16670                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16677                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16681                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  PROGRAM                                          SPID                     SQL_ID        SQL_TEXT1
- ------------------------------------------------ ------------------------ ------------- -------------------------------------------
  JDBC Thin Client                                 17094                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 17843                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16683                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16687                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16952                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  sqlplus@irora09s (TNS V1-V3)                     11233                    7qxp4ywv5xvtw insert /*+ append */         into ord_t_ite
  JDBC Thin Client                                 16664                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  plsqlDev.exe                                     45231                    6ph04820fdr0z select /*+use_nl(a,b,c)*/distinct a.sid,a.s
  JDBC Thin Client                                 35078                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35080                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 35082                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16738                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 16807                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T
  JDBC Thin Client                                 17257                    gp99rgyddj2h3 insert into ORD_T_ITEM_REPOSITORY(ORDERID,T


总结:
a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。
b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。
c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangliang0703

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值