並行查詢對於響應時間的影響實驗

wei-xh發表於2010-05-08
測試表AC43有記錄204690413,二億多條。
並行處理花費時間17.47秒,正常查詢花費時間49.21,將近三倍的差距。
SQL> set timing on
SQL> set autotrace on
SQL> SELECT /*+ parallel(ac04 5) */count(DISTINCT aac001)  FROM ac04;

COUNT(DISTINCTAAC001)
---------------------
              1156171

已用時間:  00: 00: 17.47

執行計劃
----------------------------------------------------------
Plan hash value: 3388306996

-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |          |     1 |     5 | 13199   (1)| 00:02:39 |        |      |            |
|   1 |  SORT GROUP BY            |          |     1 |     5 |            |          |        |      |            |
|   2 |   PX COORDINATOR          |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)    | :TQ10001 |     1 |     5 |            |          |  Q1,01 | P->S | QC (RAND)  |
|   4 |     SORT GROUP BY         |          |     1 |     5 |            |          |  Q1,01 | PCWP |            |
|   5 |      PX RECEIVE           |          |     1 |     5 |            |          |  Q1,01 | PCWP |            |
|   6 |       PX SEND HASH        | :TQ10000 |     1 |     5 |            |          |  Q1,00 | P->P | HASH       |
|   7 |        SORT GROUP BY      |          |     1 |     5 |            |          |  Q1,00 | PCWP |            |
|   8 |         PX BLOCK ITERATOR |          |    26M|   124M| 13199   (1)| 00:02:39 |  Q1,00 | PCWC |            |
|   9 |          TABLE ACCESS FULL| AC04     |    26M|   124M| 13199   (1)| 00:02:39 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------------------


統計資訊
----------------------------------------------------------
         87  recursive calls
          4  db block gets
     277758  consistent gets
     277030  physical reads
        720  redo size
        223  bytes sent via SQL*Net to client
        239  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         12  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> SELECT count(DISTINCT aac001)  FROM ac04;

COUNT(DISTINCTAAC001)
---------------------
              1156171

已用時間:  00: 00: 49.21

執行計劃
----------------------------------------------------------
Plan hash value: 345483231

---------------------------------------------------------------------------------
| Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |         |     1 |     5 | 25391   (2)| 00:05:05 |
|   1 |  SORT GROUP BY        |         |     1 |     5 |            |          |
|   2 |   INDEX FAST FULL SCAN| PK_AC04 |    26M|   124M| 25391   (2)| 00:05:05 |
---------------------------------------------------------------------------------


統計資訊
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     119794  consistent gets
          2  physical reads
        688  redo size
        240  bytes sent via SQL*Net to client
        239  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


可是我在一張相對較小的表AC01上測試的情況恰恰相反。
並行用了9秒多,正常查詢只用了2秒多。
檢視執行計劃,並行查詢用了全表掃描,正常的查詢是索引的方式。
看來用並行查詢的時候還是需要提前做好測試。
SQL> SELECT /*+ parallel(ac01 5) */count(DISTINCT aac003)  FROM ac01;

COUNT(DISTINCTAAC003)
---------------------
               879392

已用時間:  00: 00: 09.41

執行計劃
----------------------------------------------------------
Plan hash value: 1972307605

------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |          |     1 |     7 |  2881   (1)| 00:00:35 |        |      |
|   1 |  SORT GROUP BY            |          |     1 |     7 |            |          |        |      |
|   2 |   PX COORDINATOR          |          |       |       |            |          |        |      |
|   3 |    PX SEND QC (RANDOM)    | :TQ10001 |     1 |     7 |            |          |  Q1,01 | P->S | QC (RAND)
|   4 |     SORT GROUP BY         |          |     1 |     7 |            |          |  Q1,01 | PCWP |
|   5 |      PX RECEIVE           |          |     1 |     7 |            |          |  Q1,01 | PCWP |
|   6 |       PX SEND HASH        | :TQ10000 |     1 |     7 |            |          |  Q1,00 | P->P | HASH
|   7 |        SORT GROUP BY      |          |     1 |     7 |            |          |  Q1,00 | PCWP |
|   8 |         PX BLOCK ITERATOR |          |  1928K|    12M|  2881   (1)| 00:00:35 |  Q1,00 | PCWC |
|   9 |          TABLE ACCESS FULL| AC01     |  1928K|    12M|  2881   (1)| 00:00:35 |  Q1,00 | PCWP |
------------------------------------------------------------------------------------------------------------------


統計資訊
----------------------------------------------------------
         53  recursive calls
          3  db block gets
      60275  consistent gets
      60094  physical reads
        728  redo size
        239  bytes sent via SQL*Net to client
        239  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         12  sorts (memory)
          0  sorts (disk)
          1  rows processed
SQL> SELECT count(DISTINCT aac003)  FROM ac01;
COUNT(DISTINCTAAC003)
---------------------
               880064
已用時間:  00: 00: 01.76
執行計劃
----------------------------------------------------------
Plan hash value: 3761785375
-----------------------------------------------------------------------------------------
| Id  | Operation             | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                 |     1 |     7 |  1064   (3)| 00:00:13 |
|   1 |  SORT GROUP BY        |                 |     1 |     7 |            |          |
|   2 |   INDEX FAST FULL SCAN| IDX_AC01_AAC003 |  1928K|    12M|  1064   (3)| 00:00:13 |
-----------------------------------------------------------------------------------------

統計資訊
----------------------------------------------------------
          2  recursive calls
          0  db block gets
       5428  consistent gets
          0  physical reads
          0  redo size
        239  bytes sent via SQL*Net to client
        239  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

還有怎麼才能在查詢中使用兩個HINT,我試瞭如下的方式,使用並行查詢,且想讓查詢使用索引IDX_AC01_AAC003,結果用的是另一個索引,並行查詢也沒起作用。我這種寫法對嗎?
SQL>  SELECT /*+ parallel(ac01 5)  index(ac01 IDX_AC01_AAC003) */count(DISTINCT aac003)  FROM ac01;

COUNT(DISTINCTAAC003)
---------------------
               879393

已用時間:  00: 00: 14.47

執行計劃
----------------------------------------------------------
Plan hash value: 994991478
-------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                 |     1 |     7 |   144K  (1)| 00:28:53 |
|   1 |  SORT GROUP BY                |                 |     1 |     7 |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID | AC01            |  1928K|    12M|   144K  (1)| 00:28:53 |
|   3 |    BITMAP CONVERSION TO ROWIDS|                 |       |       |            |          |
|   4 |     BITMAP INDEX FULL SCAN    | IDX_AC01_BAC136 |       |       |            |          |
-------------------------------------------------------------------------------------------------

統計資訊
----------------------------------------------------------
          3  recursive calls
          0  db block gets
     210121  consistent gets
         53  physical reads
        216  redo size
        239  bytes sent via SQL*Net to client
        239  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


[ 本帖最後由 wei-xh 於 2010-5-4 09:59 編輯 ]

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

相關文章