查看: 2683|回复: 8

DML语句的性能优化问题

[复制链接]
论坛徽章:
0
发表于 2011-7-27 17:18 | 显示全部楼层 |阅读模式
环境1: linux 4+10g   表abc数据 2000+
语句 delete from abc a where rowid not in (select max(rowid) from abc b group by email);

执行计划:
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name            | Rows  | Bytes   | Cost (%CPU)   | Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT      |                     |     1     |    24   |    20  (10)| 00:00:01 |
|   1 |  DELETE                        | abc               |            |            |                |                |
|* 2 |   HASH JOIN ANTI          |                     |     1    |    24    |    20  (10)| 00:00:01 |
|   3 |    TABLE ACCESS FULL   | abc              |  2341 | 28092 |     9   (0)  | 00:00:01 |
|   4 |    VIEW                          | VW_NSO_1  |  2341 | 28092 |    10  (10)| 00:00:01 |
|   5 |     SORT GROUP BY        |                     |  2341 | 70230 |    10  (10) | 00:00:01 |
|   6 |      TABLE ACCESS FULL| abc               |  2341 | 70230 |     9   (0)   | 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(ROWID="$nso_col_1")

这个很正常,可是同样的一条语句在下面:

环境1: linux 5+11g   表abc数据 2000+
语句 delete from abc a where rowid not in (select max(rowid) from abc b group by email);

执行计划:
------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name | Rows | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT              |         |   117  |  1404  | 12955 (10)| 00:02:36 |
|   1 |  DELETE                                | abc  |            |            |                   |                |
|* 2 |   FILTER                                |         |            |            |                   |                |
|   3 |    TABLE ACCESS FULL          | abc   |  2341  | 28092 |    10   (0)   | 00:00:01 |
|* 4 |    FILTER                               |         |             |            |                  |                 |
|   5 |     HASH GROUP BY               |         |  2224   | 66720 |    11  (10)  | 00:00:01 |
|   6 |      TABLE ACCESS FULL        | abc  |  2341   | 70230 |    10   (0)   | 00:00:01 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter( NOT EXISTS (SELECT 0 FROM "ABC" "B" GROUP BY "EMAIL"
              HAVING LNNVL(MAX(ROWID)<>:B1)))
   4 - filter(LNNVL(MAX(ROWID)<>:B1))

而且这个delete 语句如果是select的话,就很快的,表都统计过, 求分析
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2011-07-22 01:01:02蜘蛛蛋
日期:2011-08-24 14:10:13ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26
发表于 2011-7-27 19:21 | 显示全部楼层
分析啥? 是 分析2个执行计划为什么不一样还是?

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2011-7-27 19:45 | 显示全部楼层
估计是个bug,我测试了下,有2个问题:
1.无法解析出max(rowid)本身是is not null的了
2.手工限制后也无法做unnest

可以改成not exists,或者手工限制max(rowid)+hint optimizer_features_enable('10.2.0.4')

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2011-7-27 20:07 | 显示全部楼层
恩, 改语句是可以解决问题的,而且有好几种方法可以实现,只是我想研究下,环境2下,为什么执行计划会这样,最后的那个DELETE STATEMENT   语句走的这么慢,而且这个语句根本就没有要删除的数据

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2011-7-27 20:09 | 显示全部楼层

回复 #4 MatriX-staff 的帖子

应该是个bug啊

执行计划出错了,和删除多少数据没关系

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2011-7-27 20:47 | 显示全部楼层
关键有点不大会看10053事件,说不定从这里面能够解释原因

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2011-7-27 20:53 | 显示全部楼层
10053里只能看到subquery unnest 失败,这地方明显是不合理的

从原理上来说已经满足了所有做 unnest的条件了,而且unnest的成本明显低于现在的执行计划

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
46
ITPUB元老
日期:2011-08-06 00:48:09最佳人气徽章
日期:2012-03-13 17:39:18版主1段
日期:2013-03-07 02:21:02ITPUB季度 技术新星
日期:2011-11-18 16:54:31ITPUB伯乐
日期:2012-02-16 14:53:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:45会员2007贡献徽章
日期:2007-09-26 18:42:10玉石琵琶
日期:2012-02-21 15:04:38授权会员
日期:2007-01-26 09:19:03数据库板块每日发贴之星
日期:2011-08-04 01:01:01
发表于 2011-7-27 22:11 | 显示全部楼层
explain plan for
delete from abc a
where not exists(select 1 from abc b
where a.email=b.email
and a.rowid>b.rowid)

楼主把上面语句的执行计划贴上来,比较一下

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
发表于 2011-7-27 22:23 | 显示全部楼层
加unnest提示看看

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表