楼主: ynlzy

[SQL] sql 优化问题请教

[复制链接]
论坛徽章:
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
11#
发表于 2017-4-24 14:10 | 只看该作者
ynlzy 发表于 2017-4-24 11:16
SQL> explain plan for
  2  select object_name, object_id from t5 ta
  3  where exists

HAVING MAX("OBJECT_ID")=:B3
应该是谓词推进了

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2017-4-24 14:34 | 只看该作者
〇〇 发表于 2017-4-24 14:10
HAVING MAX("OBJECT_ID")=:B3
应该是谓词推进了

SQL> explain plan for
  2  select     object_name, object_id from t5 ta
  3  where exists
  4          ( select   /*+ NO_PUSH_PRED */ 1 from (select   object_name ,max(object_id) object_id
  5                  from t5
                where object_id < 10000
  6    7                  group by object_name
  8                  ) tb
  9            where ta.object_name =tb.object_name
10                    and ta.object_id = tb.object_id
11            );

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2521264107

-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     1 |    28 |    42M  (1)|142:05:44 |
|*  1 |  FILTER              |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL  | T5   |   102K|  2808K|   423   (1)| 00:00:06 |
|*  3 |   FILTER             |      |       |       |            |          |
|   4 |    HASH GROUP BY     |      |     1 |    28 |   424   (1)| 00:00:06 |
|*  5 |     TABLE ACCESS FULL| T5   |     1 |    28 |   423   (1)| 00:00:06 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------

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

   1 - filter( EXISTS (SELECT 0 FROM "T5" "T5" WHERE "OBJECT_NAME"=:B1
              AND "OBJECT_ID"<10000 GROUP BY "OBJECT_NAME",:B2 HAVING
              MAX("OBJECT_ID")=:B3))
   3 - filter(MAX("OBJECT_ID")=:B1)
   5 - filter("OBJECT_NAME"=:B1 AND "OBJECT_ID"<10000)

21 rows selected.
加了 hint 还是没效果

使用道具 举报

回复
论坛徽章:
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
13#
发表于 2017-4-24 14:39 | 只看该作者
ynlzy 发表于 2017-4-24 14:34
SQL> explain plan for
  2  select     object_name, object_id from t5 ta
  3  where exists

执行计划更差了

使用道具 举报

回复
论坛徽章:
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#
发表于 2017-4-24 14:41 | 只看该作者
把tb存入一个物理表呢

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2017-4-24 14:47 | 只看该作者
〇〇 发表于 2017-4-24 14:41
把tb存入一个物理表呢

奇怪了 我就模拟不出那哥们的执行计划来

使用道具 举报

回复
论坛徽章:
31
管理团队2006纪念徽章
日期:2006-04-16 22:44:452012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52铁扇公主
日期:2012-02-21 15:02:402013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14
16#
发表于 2017-4-24 20:05 | 只看该作者
ynlzy 发表于 2017-4-24 14:47
奇怪了 我就模拟不出那哥们的执行计划来

版本问题。12.1 or 12.2 以上。
  1. SQL> explain plan for
  2.   2  select
  3.   3  /*+
  4.   4  OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
  5.   5  */
  6.   6  object_name, object_id from t1 ta
  7.   7  where exists
  8.   8     ( select /*+ unnest*/ 1 from (select object_name ,max(object_id) object_id
  9.   9             from t1
  10. 10             where object_id < 10000
  11. 11             group by object_name
  12. 12             ) tb
  13. 13       where ta.object_name =tb.object_name
  14. 14             and ta.object_id = tb.object_id
  15. 15       );

  16. Explained.

  17. SQL> @xplan

  18. PLAN_TABLE_OUTPUT
  19. --------------------------------------------------------------------------------
  20. Plan hash value: 3443957669

  21. -----------------------------------------------------------------------------
  22. | Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
  23. -----------------------------------------------------------------------------
  24. |   0 | SELECT STATEMENT     |      |     1 |    13 |   201  (25)| 00:00:01 |
  25. |*  1 |  FILTER              |      |       |       |            |          |
  26. |   2 |   TABLE ACCESS FULL  | T1   |    99 |  1287 |     3   (0)| 00:00:01 |
  27. |*  3 |   FILTER             |      |       |       |            |          |
  28. |   4 |    HASH GROUP BY     |      |     1 |    13 |     4  (25)| 00:00:01 |
  29. |*  5 |     TABLE ACCESS FULL| T1   |     1 |    13 |     3   (0)| 00:00:01 |

  30. PLAN_TABLE_OUTPUT
  31. --------------------------------------------------------------------------------
复制代码

使用道具 举报

回复
论坛徽章:
31
管理团队2006纪念徽章
日期:2006-04-16 22:44:452012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52铁扇公主
日期:2012-02-21 15:02:402013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14
17#
发表于 2017-4-24 20:05 | 只看该作者
本帖最后由 wing hong 于 2017-4-24 20:08 编辑
ynlzy 发表于 2017-4-24 14:47
奇怪了 我就模拟不出那哥们的执行计划来
不过 , 奇怪的是, 好像 12c 的optimizer 的 新特性也没提这个。可能漏了。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2017-4-25 01:31 | 只看该作者
wing hong 发表于 2017-4-22 20:16
老大厉害, 还看语义。

我是纯看plan 。

我是搞开发的,所以第一反应是看代码,争取把愚蠢的想法扼杀在源头。
像这样的需求十有八九是用分析函数更好。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
19#
发表于 2017-4-25 01:36 | 只看该作者
wing hong 发表于 2017-4-24 20:05
不过 , 奇怪的是, 好像 12c 的optimizer 的 新特性也没提这个。可能漏了。

12C有对标量子查询的unnest,这个也类似吧。

http://blog.tanelpoder.com/2013/ ... ing-transformation/

使用道具 举报

回复
论坛徽章:
31
管理团队2006纪念徽章
日期:2006-04-16 22:44:452012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52铁扇公主
日期:2012-02-21 15:02:402013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14
20#
发表于 2017-4-25 07:30 | 只看该作者
newkid 发表于 2017-4-25 01:36
12C有对标量子查询的unnest,这个也类似吧。

http://blog.tanelpoder.com/2013/08/13/oracle-12c-scal ...

这个是对原有的where exists unnest 的 增强, 应该不是 scalar subquery unnest 的 code path 吧。

使用道具 举报

回复

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

本版积分规则 发表回复

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