楼主: 〇〇

一个oracle执行计划不好的例子,dm的计划如何?

[复制链接]
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
11#
发表于 2013-9-10 09:22 | 只看该作者
〇〇 发表于 2013-9-9 21:21
查询是dm快,oracle不知哪里秀逗了

dm7可以看到执行计划里面每个操作符的执行时间,如果秀逗的话,可以知道在哪里秀逗了,呵呵

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
12#
 楼主| 发表于 2013-9-10 09:24 | 只看该作者
myth8860 发表于 2013-9-10 09:22
dm7可以看到执行计划里面每个操作符的执行时间,如果秀逗的话,可以知道在哪里秀逗了,呵呵

贴出一个dm秀逗的看看

使用道具 举报

回复
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
13#
发表于 2013-9-10 09:26 | 只看该作者
〇〇 发表于 2013-9-10 09:24
贴出一个dm秀逗的看看

目前发现的秀逗的都改掉了,我再发现一个秀逗的发你看看。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
14#
 楼主| 发表于 2013-9-10 09:48 | 只看该作者
oracle显示的实际计划

SQL> set autot off
SQL> select /*+ gather_plan_statistics */   b.b,
  2         max(b.id) , /*很快*/
  3         min(b.id) min_used
  4    from big b,
  5         (select distinct e.a
  6            from e
  7          where e.a like '1%') m
  8  where b.a>=3
  9     and b.a<=4
10     and b.b= m.a
11  group by b.b;
select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));
         B  MAX(B.ID)   MIN_USED
---------- ---------- ----------
         1     999863         59
        11     999989         11
        12     999961        157
        10     999988         10

SQL> /
  2  ;
select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));/
                                                                         *
第 1 行出现错误:
ORA-00911: 无效字符


SQL> select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  anbybgr6yf8u1, child number 0
-------------------------------------
select /*+ gather_plan_statistics */   b.b,        max(b.id) , /*很快*/
     min(b.id) min_used   from big b,        (select distinct e.a
    from e         where e.a like '1%') m where b.a>=3    and b.a<=4
and b.b= m.a group by b.b

Plan hash value: 69571800

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |      1 |        |      4 |00:00:00.16 |    2230 |       |       |          |
|   1 |  HASH GROUP BY        |          |      1 |     13 |      4 |00:00:00.16 |    2230 |   838K|   838K| 1224K (0)|
|*  2 |   HASH JOIN           |          |      1 |    128K|  39410 |00:00:00.20 |    2230 |  1517K|  1517K|  828K (0)|
|   3 |    VIEW               | VW_GBF_5 |      1 |     13 |      4 |00:00:00.01 |      22 |       |       |          |
|   4 |     HASH GROUP BY     |          |      1 |     13 |      4 |00:00:00.01 |      22 |  1518K|  1518K|  708K (0)|
|*  5 |      TABLE ACCESS FULL| E        |      1 |    500 |   3077 |00:00:00.01 |      22 |       |       |          |
|*  6 |    TABLE ACCESS FULL  | BIG      |      1 |    285K|    285K|00:00:00.13 |    2208 |       |       |          |
-----------------------------------------------------------------------------------------------------------------------

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

   2 - access("B"."B"="ITEM_1")
   5 - filter(TO_CHAR("E"."A") LIKE '1%')
   6 - filter(("B"."A">=3 AND "B"."A"<=4))


已选择28行。

SQL> select /*+ gather_plan_statistics */b.b,
  2         max(b.id) - /*很慢*/
  3         min(b.id) min_used
  4    from big b,
  5         (select distinct e.a
  6            from e
  7          where e.a like '1%') m
  8  where b.a>=3
  9     and b.a<=4
10     and b.b= m.a
11  group by b.b;

select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

         B   MIN_USED
---------- ----------
         1     999804
        11     999978
        12     999804
        10     999978

SQL> SQL>
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  238f8vj22nb8m, child number 0
-------------------------------------
select /*+ gather_plan_statistics */b.b,        max(b.id) - /*很慢*/
  min(b.id) min_used   from big b,        (select distinct e.a
from e         where e.a like '1%') m where b.a>=3    and b.a<=4
and b.b= m.a group by b.b

Plan hash value: 2033372611

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |      4 |00:00:10.61 |    2230 |       |       |          |
|   1 |  HASH GROUP BY      |      |      1 |     13 |      4 |00:00:10.61 |    2230 |   838K|   838K| 4105K (0)|
|*  2 |   HASH JOIN         |      |      1 |   4926K|     30M|00:00:05.75 |    2230 |  1517K|  1517K| 1004K (0)|
|*  3 |    TABLE ACCESS FULL| E    |      1 |    500 |   3077 |00:00:00.01 |      22 |       |       |          |
|*  4 |    TABLE ACCESS FULL| BIG  |      1 |    285K|    285K|00:00:00.09 |    2208 |       |       |          |
-----------------------------------------------------------------------------------------------------------------

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

   2 - access("B"."B"="E"."A")
   3 - filter(TO_CHAR("E"."A") LIKE '1%')
   4 - filter(("B"."A">=3 AND "B"."A"<=4))


已选择26行。

使用道具 举报

回复
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
15#
发表于 2013-9-10 10:14 | 只看该作者
〇〇 发表于 2013-9-10 09:48
oracle显示的实际计划

SQL> set autot off

dm7这两个语句的计划是一样的

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
16#
 楼主| 发表于 2013-9-10 10:44 | 只看该作者
〇〇 发表于 2013-9-10 09:48
oracle显示的实际计划

SQL> set autot off

另一台window机器的计划

SQL> conn / as sysdba
已连接。
SQL> grant dba to scott;

授权成功。

已用时间:  00: 00: 00.02
SQL> conn scott/tiger
已连接。
SQL> select /*+ gather_plan_statistics */   b.b,
  2         max(b.id) , /*很快*/
  3         min(b.id) min_used
  4    from big b,
  5         (select distinct e.a
  6            from e
  7          where e.a like '1%') m
  8  where b.a>=3
  9     and b.a<=4
10     and b.b= m.a
11  group by b.b;

                   B            MAX(B.ID)             MIN_USED
-------------------- -------------------- --------------------
                   1               999863                   59
                  11               999989                   11
                  12               999961                  157
                  10               999988                   10

已用时间:  00: 00: 00.26
SQL>
SQL> select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  anbybgr6yf8u1, child number 1
-------------------------------------
select /*+ gather_plan_statistics */   b.b,        max(b.id) , /*很快*/
     min(b.id) min_used   from big b,        (select distinct e.a
    from e         where e.a like '1%') m where b.a>=3    and b.a<=4
and b.b= m.a group by b.b

Plan hash value: 69571800

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |      1 |        |      4 |00:00:00.25 |    2230 |       |    |             |
|   1 |  HASH GROUP BY        |          |      1 |      4 |      4 |00:00:00.25 |    2230 |   838K|   838K|  708K (0)|
|*  2 |   HASH JOIN           |          |      1 |  39409 |  39410 |00:00:00.38 |    2230 |  1517K|  1517K|  959K (0)|
|   3 |    VIEW               | VW_GBF_5 |      1 |      4 |      4 |00:00:00.01 |      22 |       |    |             |
|   4 |     HASH GROUP BY     |          |      1 |      4 |      4 |00:00:00.01 |      22 |  1518K|  1518K| 1249K (0)|
|*  5 |      TABLE ACCESS FULL| E        |      1 |   3077 |   3077 |00:00:00.01 |      22 |       |    |             |
|*  6 |    TABLE ACCESS FULL  | BIG      |      1 |    285K|    285K|00:00:00.57 |    2208 |       |    |             |
-----------------------------------------------------------------------------------------------------------------------

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

   2 - access("B"."B"="ITEM_1")
   5 - filter(TO_CHAR("E"."A") LIKE '1%')
   6 - filter(("B"."A">=3 AND "B"."A"<=4))

Note
-----
   - cardinality feedback used for this statement


已选择32行。

已用时间:  00: 00: 00.12
SQL>
SQL> select /*+ gather_plan_statistics */b.b,
  2         max(b.id) - /*很慢*/
  3         min(b.id) min_used
  4    from big b,
  5         (select distinct e.a
  6            from e
  7          where e.a like '1%') m
  8  where b.a>=3
  9     and b.a<=4
10     and b.b= m.a
11  group by b.b;

                   B             MIN_USED
-------------------- --------------------
                   1               999804
                  10               999978
                  11               999978
                  12               999804

已用时间:  00: 00: 19.31
SQL>
SQL> select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  238f8vj22nb8m, child number 1
-------------------------------------
select /*+ gather_plan_statistics */b.b,        max(b.id) - /*很慢*/
  min(b.id) min_used   from big b,        (select distinct e.a
from e         where e.a like '1%') m where b.a>=3    and b.a<=4
and b.b= m.a group by b.b

Plan hash value: 1216833904

------------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |      1 |        |      4 |00:00:05.13 |    2230 |       |       |          |
|   1 |  SORT GROUP BY NOSORT|      |      1 |      4 |      4 |00:00:05.13 |    2230 |       |       |          |
|   2 |   MERGE JOIN         |      |      1 |     30M|     30M|00:03:42.88 |    2230 |       |       |          |
|   3 |    SORT JOIN         |      |      1 |   3077 |   3077 |00:00:00.03 |      22 | 70656 | 70656 |63488  (0)|
|*  4 |     TABLE ACCESS FULL| E    |      1 |   3077 |   3077 |00:00:00.01 |      22 |       |       |          |
|*  5 |    SORT JOIN         |      |   3077 |    285K|     30M|00:00:46.86 |    2208 |  8628K|  1150K| 7669K (0)|
|*  6 |     TABLE ACCESS FULL| BIG  |      1 |    285K|    285K|00:00:01.43 |    2208 |       |       |          |
------------------------------------------------------------------------------------------------------------------

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

   4 - filter(TO_CHAR("E"."A") LIKE '1%')
   5 - access("B"."B"="E"."A")
       filter("B"."B"="E"."A")
   6 - filter(("B"."A">=3 AND "B"."A"<=4))

Note
-----
   - cardinality feedback used for this statement


已选择33行。

已用时间:  00: 00: 00.06

使用道具 举报

回复
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
17#
发表于 2013-9-10 11:13 | 只看该作者
myth8860 发表于 2013-9-10 10:14
dm7这两个语句的计划是一样的

贴一下达梦的计划, 和Oracle比较下.

需要查查Insert 慢的问题.

使用道具 举报

回复
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
18#
发表于 2013-9-10 11:36 | 只看该作者
本帖最后由 myth8860 于 2013-9-10 11:39 编辑
pkmonster 发表于 2013-9-10 11:13
贴一下达梦的计划, 和Oracle比较下.

需要查查Insert 慢的问题.
oracle走了MERGE JOIN         

explain select b.b,
       max(b.id) , /*很快*/
       min(b.id) min_used
  from big b,
       (select distinct e.a
          from e
        where e.a like '1%') m
where b.a>=3
   and b.a<=4
   and b.b= m.a
group by b.b;



1   #NSET2: [119, 1, 16]
2     #PRJT2: [119, 1, 16]; exp_num(3), is_atom(FALSE)
3       #HAGR2: [119, 1, 16]; grp_num(1), sfun_num(2)
4         #HASH2 INNER JOIN: [119, 1, 16];  KEY_NUM(1);
5           #PRJT2: [1, 5, 4]; exp_num(1), is_atom(FALSE)
6             #DISTINCT: [1, 5, 4]
7               #SLCT2: [1, 500, 4]; exp_cast(E.A) LIKE 1%%
8                 #CSCN2: [1, 10000, 4]; INDEX33559697(E)
9           #SLCT2: [116, 2500, 12]; (B.A >= 3 AND B.A <= 4)
10            #CSCN2: [116, 1000000, 12]; INDEX33559699(B)


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

explain select b.b,
       max(b.id) - /*很慢*/
       min(b.id) min_used
  from big b,
       (select distinct e.a
          from e
        where e.a like '1%') m
where b.a>=3
   and b.a<=4
   and b.b= m.a
group by b.b;


1   #NSET2: [119, 1, 16]
2     #PRJT2: [119, 1, 16]; exp_num(2), is_atom(FALSE)
3       #HAGR2: [119, 1, 16]; grp_num(1), sfun_num(2)
4         #HASH2 INNER JOIN: [119, 1, 16];  KEY_NUM(1);
5           #PRJT2: [1, 5, 4]; exp_num(1), is_atom(FALSE)
6             #DISTINCT: [1, 5, 4]
7               #SLCT2: [1, 500, 4]; exp_cast(E.A) LIKE 1%%
8                 #CSCN2: [1, 10000, 4]; INDEX33559697(E)
9           #SLCT2: [116, 2500, 12]; (B.A >= 3 AND B.A <= 4)
10            #CSCN2: [116, 1000000, 12]; INDEX33559699(B)



使用道具 举报

回复
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
19#
发表于 2013-9-10 12:17 | 只看该作者
达梦用一个显式的投影操作符(PRJT2)来计算查询项,  两个查询唯一的差别也在于查询项,后一个多了一个计算.

不明白oracle为什么要加个SORT, 然后做Merge, 应该慢在排序上。

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
20#
发表于 2013-9-10 13:29 | 只看该作者
相同的sql?

使用道具 举报

回复

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

本版积分规则 发表回复

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