2014-09-08 2 views
2

При создании отчета на основе нескольких таблиц, из которых некоторые действительно огромны (1+ млрд записей), а некоторые довольно мелкие (100 записей) занимают 17 минут. но где я добавил условие к предложению where, которое он начал работать в течение 1 часа.Oracle добавляет условие, в котором предложение замедляет запрос

Таблица 1 содержит 1+ млрд записей, а добавленное условие: «и line_ind in (« Y »,« * »)». Вопрос: почему CBO собирается для полного сканирования таблицы, когда он может искать из результирующего набора соединений. Упорядоченный намек, похоже, не помогает, и поэтому интересно, как сделать этот выбор быстрее.

вот запись подсчитывает для таблиц

table1(a) 1,234,432,435 
table2(b) 1,234,432,435 
table3(c) 900 
table4(d) 602,364,856 
table5(e) 80 
table6(f) 50 
table7(g) 264,938,373 
table8(h) 14,827 



SELECT DISTINCT c_cd, 
        ci_nbr, 
        c.s_id1, 
        d.d_cd, 
        SUM (CASE WHEN (D_CD = 'MAILED') THEN 1 ELSE 0 END) AS MAILED 
    FROM table1 a 
     LEFT OUTER JOIN table2 b ON (a.o_id = b.o_id AND a.co_sid = b.co_sid) 
     INNER JOIN table3 c 
      ON c.c_sid = a.c_sid AND c.c_cd IN ('CC364', 'CC552') 
     INNER JOIN table4 c ON a.sc_sid = c.sc_sid 
     INNER JOIN table5 d ON d.d_SID = b.d_SID 
     INNER JOIN table6 e ON e.cc_sid = b.cc_sid 
     INNER JOIN table7 f ON f.ci_sid = b.ci_sid 
     INNER JOIN table8 g ON g.dt_sid = a.dt_sid 
GROUP BY dt_cd, 
     c_nbr, 
     c.s_id1, 
     d.d_cd 
where dt_cd in ('c6543-010114','c5653-010514') and line_ind in ('Y', '*') and c_nbr='728246' 

Explain Plan

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation           | Name       | E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT         |        | 811 | 296K| 304K (3)| 01:11:02 |  |  |  |  |   | 
| 1 | PX COORDINATOR         |        |  |  |   |   |  |  |  |  |   | 
| 2 | PX SEND QC (RANDOM)        | :TQ10009      | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,09 | P->S | QC (RAND) | 
| 3 | HASH GROUP BY         |        | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,09 | PCWP |   | 
| 4 |  PX RECEIVE         |        | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,09 | PCWP |   | 
| 5 |  PX SEND HASH         | :TQ10008      | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,08 | P->P | HASH  | 
| 6 |  HASH GROUP BY        |        | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,08 | PCWP |   | 
|* 7 |  HASH JOIN         |        | 811 | 296K| 304K (3)| 01:11:02 |  |  | Q1,08 | PCWP |   | 
| 8 |   PX RECEIVE        |        | 802 | 278K| 277K (4)| 01:04:39 |  |  | Q1,08 | PCWP |   | 
| 9 |   PX SEND BROADCAST      | :TQ10007      | 802 | 278K| 277K (4)| 01:04:39 |  |  | Q1,07 | P->P | BROADCAST | 
|* 10 |   HASH JOIN        |        | 802 | 278K| 277K (4)| 01:04:39 |  |  | Q1,07 | PCWP |   | 
| 11 |   PX RECEIVE        |        | 802 | 177K| 225K (4)| 00:52:44 |  |  | Q1,07 | PCWP |   | 
| 12 |    PX SEND BROADCAST      | :TQ10006      | 802 | 177K| 225K (4)| 00:52:44 |  |  | Q1,06 | P->P | BROADCAST | 
|* 13 |    HASH JOIN BUFFERED     |        | 802 | 177K| 225K (4)| 00:52:44 |  |  | Q1,06 | PCWP |   | 
| 14 |    PX RECEIVE       |        |  96 | 4800 |  2 (0)| 00:00:01 |  |  | Q1,06 | PCWP |   | 
| 15 |    PX SEND BROADCAST     | :TQ10004      |  96 | 4800 |  2 (0)| 00:00:01 |  |  | Q1,04 | P->P | BROADCAST | 
| 16 |     PX BLOCK ITERATOR     |        |  96 | 4800 |  2 (0)| 00:00:01 |  |  | Q1,04 | PCWC |   | 
| 17 |     TABLE ACCESS STORAGE FULL  | TABLE5       |  96 | 4800 |  2 (0)| 00:00:01 |  |  | Q1,04 | PCWP |   | 
|* 18 |    HASH JOIN       |        | 802 | 138K| 225K (4)| 00:52:44 |  |  | Q1,06 | PCWP |   | 
| 19 |    BUFFER SORT      |        |  |  |   |   |  |  | Q1,06 | PCWC |   | 
| 20 |     PX RECEIVE      |        |  51 | 561 |  5 (0)| 00:00:01 |  |  | Q1,06 | PCWP |   | 
| 21 |     PX SEND HASH      | :TQ10000      |  51 | 561 |  5 (0)| 00:00:01 |  |  |  | S->P | HASH  | 
| 22 |     TABLE ACCESS STORAGE FULL  | TABLE6       |  51 | 561 |  5 (0)| 00:00:01 |  |  |  |  |   | 
| 23 |    PX RECEIVE       |        | 802 | 130K| 225K (4)| 00:52:44 |  |  | Q1,06 | PCWP |   | 
| 24 |     PX SEND HASH      | :TQ10005      | 802 | 130K| 225K (4)| 00:52:44 |  |  | Q1,05 | P->P | HASH  | 
|* 25 |     HASH JOIN      |        | 802 | 130K| 225K (4)| 00:52:44 |  |  | Q1,05 | PCWP |   | 
| 26 |     PX RECEIVE      |        | 802 | 101K| 104K (5)| 00:24:25 |  |  | Q1,05 | PCWP |   | 
| 27 |     PX SEND BROADCAST    | :TQ10003      | 802 | 101K| 104K (5)| 00:24:25 |  |  | Q1,03 | P->P | BROADCAST | 
|* 28 |      HASH JOIN      |        | 802 | 101K| 104K (5)| 00:24:25 |  |  | Q1,03 | PCWP |   | 
| 29 |      PX RECEIVE     |        |  2 | 24 | 17 (0)| 00:00:01 |  |  | Q1,03 | PCWP |   | 
| 30 |      PX SEND BROADCAST   | :TQ10001      |  2 | 24 | 17 (0)| 00:00:01 |  |  | Q1,01 | P->P | BROADCAST | 
| 31 |      PX BLOCK ITERATOR   |        |  2 | 24 | 17 (0)| 00:00:01 |  |  | Q1,01 | PCWC |   | 
|* 32 |       TABLE ACCESS STORAGE FULL | TABLE3       |  2 | 24 | 17 (0)| 00:00:01 |  |  | Q1,01 | PCWP |   | 
|* 33 |      HASH JOIN     |        | 68190 | 7857K| 104K (5)| 00:24:25 |  |  | Q1,03 | PCWP |   | 
| 34 |      PX RECEIVE     |        |  2 | 34 | 276 (0)| 00:00:04 |  |  | Q1,03 | PCWP |   | 
| 35 |      PX SEND BROADCAST   | :TQ10002      |  2 | 34 | 276 (0)| 00:00:04 |  |  | Q1,02 | P->P | BROADCAST | 
| 36 |       PX BLOCK ITERATOR   |        |  2 | 34 | 276 (0)| 00:00:04 |  |  | Q1,02 | PCWC |   | 
|* 37 |       TABLE ACCESS STORAGE FULL| TABLE8       |  2 | 34 | 276 (0)| 00:00:04 |  |  | Q1,02 | PCWP |   | 
| 38 |      PX BLOCK ITERATOR   |        |  22M| 2177M| 104K (5)| 00:24:21 |  1 |1048575| Q1,03 | PCWC |   | 
|* 39 |      TABLE ACCESS STORAGE FULL | TABLE1       |  22M| 2177M| 104K (5)| 00:24:21 |  1 |1048575| Q1,03 | PCWP |   | 
| 40 |     PX BLOCK ITERATOR    |        | 969M| 32G| 121K (3)| 00:28:15 |  1 |1048575| Q1,05 | PCWC |   | 
|* 41 |     TABLE ACCESS STORAGE FULL  | TABLE2       | 969M| 32G| 121K (3)| 00:28:15 |  1 |1048575| Q1,05 | PCWP |   | 
| 42 |   PX BLOCK ITERATOR      |        | 398M| 47G| 50955 (1)| 00:11:54 |  |  | Q1,07 | PCWC |   | 
| 43 |    TABLE ACCESS STORAGE FULL    | TABLE7       | 398M| 47G| 50955 (1)| 00:11:54 |  |  | Q1,07 | PCWP |   | 
| 44 |   PX BLOCK ITERATOR       |        | 589M| 10G| 27170 (2)| 00:06:21 |  1 | 13 | Q1,08 | PCWC |   | 
| 45 |   TABLE ACCESS STORAGE FULL    | TABLE4       | 589M| 10G| 27170 (2)| 00:06:21 |  1 | 13 | Q1,08 | PCWP |   | 
+0

Как в мире мы должны знать? Пожалуйста, покажите план объяснения или другие релевантные данные, кроме запроса. – OldProgrammer

+1

запустите план объяснения обеих версий и посмотрите, какая разница. Тогда у нас будет лучшее представление о том, что занимает больше всего времени. – Chip

+0

Один очень плохой трюк заключается в том, чтобы переместить ваше новое состояние в предложение HAVING. Это запустит предложение после предложения WHERE, и вы, вероятно, вернетесь к 17 минутам. Это НЕ рекомендуется. Но если вы нарушаете производство и нуждаетесь в очень быстром исправлении, это может быть мерой, пока вы не выясните реальную проблему. – Chip

ответ

0

Получить 10053 следов для обоих запросов. Это трассировка оптимизатора для Oracle. Вы увидите, почему оракул выбирает разные планы, вы не можете пропустить это.

Я думаю, что эта ссылка поможет вам https://blogs.oracle.com/optimizer/entry/how_do_i_capture_a вы можете google для других учебных пособий на 10053, если хотите.