【問題處理】同樣的並行表,同樣的索引結構,不同的執行計劃

secooler發表於2009-02-13
------ 能用到索引:
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 |        |      |            |
|   1 |  PX COORDINATOR      |          |       |       |            |          |        |      |            |
|   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';,這兩種執行效果哪個更高效一些?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-555652/,如需轉載,請註明出處,否則將追究法律責任。

相關文章