查看: 740|回复: 8

[性能调整] 新人,对于并行的疑问

[复制链接]
论坛徽章:
0
发表于 2020-7-28 15:57 | 显示全部楼层 |阅读模式
大家好,
问题如下:
现有一张退货表,表的数据太大,因此以 ACCOUNT_DT 会计期为分区字段建立RANGE分区,设置表的DEGREE为16.
现在对表进行如下查询:

查询1:
select account_dt from
pdm.t05_wholesale_reject_main_info
where account_dt>=DATE'2020-04-13';


执行计划1:
Plan Hash Value  : 1684244922
--------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                           | Rows    | Bytes    | Cost | Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                                | 2327644 | 18621152 | 3269 | 00:00:40 |
|   1 |   PX COORDINATOR       |                                |         |          |      |          |
|   2 |    PX SEND QC (RANDOM) | :TQ10000                       | 2327644 | 18621152 | 3269 | 00:00:40 |
|   3 |     PX BLOCK ITERATOR  |                                | 2327644 | 18621152 | 3269 | 00:00:40 |
| * 4 |      TABLE ACCESS FULL | T05_WHOLESALE_REJECT_MAIN_INFO | 2327644 | 18621152 | 3269 | 00:00:40 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 4 - filter("ACCOUNT_DT">=TO_DATE(' 2020-04-13 00:00:00', 'syyyy-mm-dd hh24:mi:ss'));


查询2:
select account_dt from
pdm.t05_wholesale_reject_main_info
where account_dt>= ADD_MONTHS(TRUNC(sysdate-15),-3);


执行计划2:
Plan Hash Value  : 3947474356
------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name                           | Rows    | Bytes    | Cost  | Time     |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                                | 2327644 | 18621152 | 40686 | 00:08:09 |
|   1 |   PX COORDINATOR          |                                |         |          |       |          |
|   2 |    PX SEND QC (RANDOM)    | :TQ10000                       | 2327644 | 18621152 | 40686 | 00:08:09 |
|   3 |     PX PARTITION LIST ALL |                                | 2327644 | 18621152 | 40686 | 00:08:09 |
| * 4 |      TABLE ACCESS FULL    | T05_WHOLESALE_REJECT_MAIN_INFO | 2327644 | 18621152 | 40686 | 00:08:09 |
------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 4 - filter("ACCOUNT_DT">=ADD_MONTHS(TRUNC(SYSDATE@!-15),-3))

两段SQL的COST 相差巨大, 同样是并行,筛选的范围也一样,为何查询1 会以数据块为粒度进行查询,而查询2 却以分区为粒度
造成差异的原因,以及ADD_MONTHS(TRUNC(sysdate-15),-3) 和 DATE'2020-04-13' 的差别,有没有大佬给新人解答下。
谢谢大家!
论坛徽章:
0
 楼主| 发表于 2020-7-28 16:00 | 显示全部楼层
求大佬解答

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2020-7-28 16:04 | 显示全部楼层
求大佬们解答,谢谢大佬

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2020-7-28 16:33 | 显示全部楼层
1、cost一般不会横向对比;
2、因为查询2中的条件有个变量,在不同日期运行会变,查询1的条件不会变,两个条件评估时可能会出现误差;
3、不清楚你们的数据分布,不好更深入的分析;
4、两个计划都是扫描了整张表;
5、有点奇怪,楼主是做的range分区,可查询2的计划里出现了list分区,确定没搞错吗?

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2020-7-28 17:21 | 显示全部楼层
sqysl 发表于 2020-7-28 16:33
1、cost一般不会横向对比;2、因为查询2中的条件有个变量,在不同日期运行会变,查询1的条件不会变,两个条 ...

晕,你有几个地方说错了
lz没有把执行计划种的part信息输出出来,所以看不到

第一个执行计划有分区裁剪,第二个执行计划 partition list all 不是list分区的意思,而是没有分区裁剪


两个执行计划cost不一样是因为,读取的分区不一样。第一个执行计划分区裁剪后会只读取几个指定的分区,第二个会读取所有分区。

每个分区都是table full scan 而已(这里的table full scan是指对分区的访问方式,而不是对整个逻辑表)

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2020-7-28 17:38 | 显示全部楼层
把表结构列出来,

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2020-7-29 09:45 | 显示全部楼层
嗯,楼主确实应该把表结构给出来,不然,这计划可能容易迷惑。

使用道具 举报

回复
论坛徽章:
0
发表于 2020-8-7 12:13 | 显示全部楼层
如果你想始终得到第一种执行计划,  设置 _px_partition_scan_enabled = false  ; 如果想得到第二种执行计划, _px_partition_scan_threshold=1   ; 至于不同写法内部是如何处理的, 咱也不知道 . 试试看行不行. 可能你想要始终得到第一个执行计划.

使用道具 举报

回复
论坛徽章:
192
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
发表于 2020-8-8 10:01 | 显示全部楼层
执行前设置
alter session set statistics_level = all;
...
@ dpc ''  ''

--//dpc脚本如下:
set verify off
--select * from table(dbms_xplan.display_cursor(NVL('&1',NULL),NULL,'ALLSTATS LAST PEEKED_BINDS &2 cost partition'));

select * from table(dbms_xplan.display_cursor(NVL('&1',NULL),NULL,'ALL ALLSTATS LAST PEEKED_BINDS cost partition -projection -outline &2'));

prompt
prompt argment : typical all advanced partition predicate remote note parallel projection alias peeked_binds outline adaptive
prompt

使用道具 举报

回复

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

本版积分规则 发表回复

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