【问题】同样的并行表,同样的索引结构,不同的执行计划

[复制链接]
查看11 | 回复5 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
------ 能用到索引:
SQL > select count(*) from dt_bar64;
COUNT(*)
----------
223413

SQL > explain plan for select * from dt_bar64 t where t.taskid = 3651 and t.trnn='000087';
Explained.
select * from table(dbms_xplan.display());
SQL >
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3845150141
-------------------------------------------------------------------------------------------
| Id| Operation
| Name| Rows| Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1 | 113 | 4 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| DT_BAR64| 1 | 113 | 4 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN
| PK_DT_BAR64 | 1 | | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T"."TASKID"=3651 AND "T"."TRNN"='000087')
14 rows selected.
------ 不能用到索引:
SQL > select count(*) from dt_bar65;
COUNT(*)
----------
234088

SQL > explain plan for select * from dt_bar65 t where t.taskid = 3651 and t.trnn='000087';
Explained.
SQL > select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2601456579
--------------------------------------------------------------------------------------------------------------
| Id| Operation
| Name | Rows| Bytes | Cost (%CPU)| Time |TQ|IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 1 |65 | 3 (0)| 00:00:01
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层

|
| 1 |PX COORDINATOR|
| | |
|
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层

|
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 |65 | 3 (0)| 00:00:01 |Q1,00 | P->S | QC (RAND)|
| 3 |PX BLOCK ITERATOR |
| 1 |65 | 3 (0)| 00:00:01 |Q1,00 | PCWC |
|
|*4 | TABLE ACCESS FULL| DT_BAR65 | 1 |65 | 3 (0)| 00:00:01 |Q1,00 | PCWP |
|
--------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("T"."TASKID"=3651 AND "T"."TRNN"='000087')
16 rows selected.

两个表都是并行度为300的表,同时在在两张表上创建相同的联合索引,索引的字段都是(TASKID,TRNN)
问题:
1.并行的表是怎样影响执行计划的?
2.请解释一下PX COORDINATOR,我查到资料是表示并行查询的执行计划会包含这个内容,但是另外一个用到索引的就不好解释了
3.在使用强制索引后执行计划显示是可以使用到索引的,select /*+ index(t,PK_DT_BAR65) */ * from dt_bar65 t where t.taskid = 3651 and t.trnn='000087';,这两种执行效果哪个更高效一些?
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
影响执行计划的东西太多了,不只是表结构。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
原帖由 netbbs 于 2009-2-13 14:46 发表
影响执行计划的东西太多了,不只是表结构。


同意您的观点,事实上也是这样的,不过我现在比较关心的是并行表对执行计划的影响,我对并行表的研究不是很多。有机会要深入测试一下。
还是希望大家能对我提出的几个小问题进行一下讨论
1.并行的表是怎样影响执行计划的?
2.请解释一下PX COORDINATOR,我查到资料是表示并行查询的执行计划会包含这个内容,但是另外一个用到索引的就不好解释了
3.在使用强制索引后执行计划显示是可以使用到索引的,select /*+ index(t,PK_DT_BAR65) */ * from dt_bar65 t where t.taskid = 3651 and t.trnn='000087';,这两种执行效果哪个更高效一些?
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
1. 并行度高,导至全表扫描成本变低。
2. 并行度高,导至全表扫描成本变低,但还是高于索引扫描,所以走索引。
3. 10046
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行