Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Подскажите как ускорить соединение таблиц  [new]
А
Guest
Как ускорить выборку вида :
select t1.time, sum(t2.v2)+sum(t3.v3)
from t1, t2, t3, tmp
where t1.id=t2.id
  and t1.id=t3.id
  and t1.obj_id = tmp.obj_id
  and t1.time between tmp.bhd_rt and tmp.bhd_rt+ 23.9 / 24  
group by t1.time
t1.id -праймари
t2.id, t3.id -форин кеи к t1.id и уникальны
temp- темповая таблица,
таблицы здоровенные. t1 порядка 30 миллионов, t2 и t3 несколько меньше.
При доступе через индексы получается даже медленнее, чем фулл скан.
Всё это на 10g R2.
11 апр 07, 12:07    [4005334]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
План, индексы, мощность выборки...
11 апр 07, 12:21    [4005421]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
A
Guest
План:
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                 |  1326 |   154K|       | 91081   (4)| 00:18:13 |
|   1 |  SORT ORDER BY                        |                 |  1326 |   154K|   376K| 91081   (4)| 00:18:13 |
|   2 |   HASH GROUP BY                       |                 |  1326 |   154K|   376K| 91081   (4)| 00:18:13 |
|   3 |    NESTED LOOPS                       |                 |  1326 |   154K|       | 91005   (4)| 00:18:13 |
|*  4 |     HASH JOIN                         |                 | 17355 |  1728K|    29M| 84055   (4)| 00:16:49 |
|*  5 |      HASH JOIN                        |                 |   320K|    26M|       | 75565   (4)| 00:15:07 |
|*  6 |       HASH JOIN                       |                 |    86 |  4128 |       |     5  (20)| 00:00:01 |
|   7 |        INDEX FULL SCAN                | TMP             |    15 |   255 |       |     1   (0)| 00:00:01 |
|   8 |        TABLE ACCESS FULL              | LIST_OBJ        |    17 |   527 |       |     3   (0)| 00:00:01 |
|   9 |       TABLE ACCESS FULL               | T1              |    41M|  1513M|       | 74063   (2)| 00:14:49 |
|  10 |      PARTITION RANGE SINGLE           |                 |  2260K|    34M|       |  3950   (4)| 00:00:48 |
|  11 |       TABLE ACCESS FULL               | T2              |  2260K|    34M|       |  3950   (4)| 00:00:48 |
|  12 |     TABLE ACCESS BY GLOBAL INDEX ROWID| T3              |     1 |    17 |       |     1   (0)| 00:00:01 |
|* 13 |      INDEX UNIQUE SCAN                | T3              |     1 |       |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------

11 апр 07, 12:40    [4005575]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Предполагая, что по возрастанию количества строк таблицы расположены так:
tmp (наименьшее число строк), t2, t3, t1 (самая большая)
можно попробовать использовать такие подсказки оптимизатору (HINTS)
select /*+ ORDERED USE_HASH(t1 t2 t3) */
   t1.time, sum(t2.v2)+sum(t3.v3)
from tmp, t1, t2, t3
where t1.id=t2.id
  and t1.id=t3.id
  and t1.obj_id = tmp.obj_id
  and t1.time between tmp.bhd_rt and tmp.bhd_rt+ 23.9 / 24  
group by t1.time

Если собрана корректная статистика, то такой же план должен получиться и при
select /*+ ALL_ROWS */
   t1.time, sum(t2.v2)+sum(t3.v3)
from t1, t2, t3, tmp
where t1.id=t2.id
  and t1.id=t3.id
  and t1.obj_id = tmp.obj_id
  and t1.time between tmp.bhd_rt and tmp.bhd_rt+ 23.9 / 24  
group by t1.time
11 апр 07, 12:42    [4005600]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
А
Guest
при /*+ ORDERED USE_HASH(t1 t2 t3) */
план получается страшный как и скорость исполнения,
а при /*+ ALL_ROWS */ такой же как и выше
11 апр 07, 13:06    [4005793]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
А
при /*+ ORDERED USE_HASH(t1 t2 t3) */
план получается страшный как и скорость исполнения,
а при /*+ ALL_ROWS */ такой же как и выше
А покажите этот "страшный план", пожалуйста...
11 апр 07, 13:18    [4005921]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
A
Guest
хинтом /*+ USE_NL(t1 t2 t3) */ получил такой,
пока лучше не получилось ничего. отрабатывает за 21 sec
---------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                     |  1326 |   154K|       | 11270   (1)| 00:02:16 |
|   1 |  HASH GROUP BY                        |                     |  1326 |   154K|   376K| 11270   (1)| 00:02:16 |
|   2 |   NESTED LOOPS                        |                     |  1326 |   154K|       | 11232   (1)| 00:02:15 |
|   3 |    NESTED LOOPS                       |                     | 17355 |  1728K|       | 10884   (1)| 00:02:11 |
|*  4 |     HASH JOIN                         |                     |   320K|    26M|       |  4464   (1)| 00:00:54 |
|   5 |      TABLE ACCESS FULL                | LIST_OBJ            |    17 |   527 |       |     3   (0)| 00:00:01 |
|   6 |      TABLE ACCESS BY INDEX ROWID      | T1                  |   104K|  3873K|       |   296   (1)| 00:00:04 |
|   7 |       NESTED LOOPS                    |                     |  1565K|    82M|       |  4442   (1)| 00:00:54 |
|   8 |        INDEX FULL SCAN                | PK_TMP              |    15 |   255 |       |     1   (0)| 00:00:01 |
|*  9 |        INDEX RANGE SCAN               | IDX_T1RT            |  2087K|       |       |    76   (2)| 00:00:01 |
|  10 |     TABLE ACCESS BY GLOBAL INDEX ROWID| T2                  |     1 |    16 |       |     1   (0)| 00:00:01 |
|* 11 |      INDEX UNIQUE SCAN                | UK_T2               |     1 |       |       |     1   (0)| 00:00:01 |
|  12 |    TABLE ACCESS BY GLOBAL INDEX ROWID | T3                  |     1 |    17 |       |     1   (0)| 00:00:01 |
|* 13 |     INDEX UNIQUE SCAN                 | UK_T3               |     1 |       |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------------

страшный план

---------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                 |  1326 |   154K|       |    12G (12)|999:59:59 |
|   1 |  HASH GROUP BY                |                 |  1326 |   154K|   360K|    12G (12)|999:59:59 |
|*  2 |   HASH JOIN                   |                 |  1326 |   154K|       |    12G (12)|999:59:59 |
|   3 |    INDEX FULL SCAN            | PK_TMP          |    15 |   255 |       |     1   (0)| 00:00:01 |
|*  4 |    HASH JOIN                  |                 |   104K|    10M|       |    12G (12)|999:59:59 |
|   5 |     TABLE ACCESS FULL         | LIST_OBJ        |    17 |   527 |       |     3   (0)| 00:00:01 |
|   6 |     MERGE JOIN                |                 |   172K|    11M|       |    12G (12)|999:59:59 |
|   7 |      SORT JOIN                |                 |  5337G|   160T|   467T|    12G (12)|999:59:59 |
|   8 |       MERGE JOIN CARTESIAN    |                 |  5337G|   160T|       |  9324M  (4)|999:59:59 |
|   9 |        PARTITION RANGE SINGLE |                 |  2361K|    38M|       |  4572   (3)| 00:00:55 |
|  10 |         TABLE ACCESS FULL     | T2              |  2361K|    38M|       |  4572   (3)| 00:00:55 |
|  11 |        BUFFER SORT            |                 |  2260K|    34M|       |  9324M  (4)|999:59:59 |
|  12 |         PARTITION RANGE SINGLE|                 |  2260K|    34M|       |  3948   (4)| 00:00:48 |
|  13 |          TABLE ACCESS FULL    | T3              |  2260K|    34M|       |  3948   (4)| 00:00:48 |
|* 14 |      SORT JOIN                |                 |    41M|  1513M|  3837M|   634K  (2)| 02:06:56 |
|  15 |       TABLE ACCESS FULL       | T1              |    41M|  1513M|       | 74063   (2)| 00:14:49 |
---------------------------------------------------------------------------------------------------------
11 апр 07, 13:28    [4006039]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
1. Приведите ТОЧНЫЙ текст селекта, который дает "страшный план".
2. Откуда-то взялась таблица LIST OBJ и пропала заявленная ранее таблица TMP
3. Планы запросов без точного текста запроса никакого полезного смысла не имеют.
11 апр 07, 14:13    [4006597]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как ускорить соединение таблиц  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
я бы попробовал следующее:
t1 соединить с tmp и материализовать результат - к которому уже клеить остальное
11 апр 07, 14:23    [4006703]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить