Присоединяйтесь к двум большим столам быстро - PullRequest
0 голосов
/ 20 ноября 2018

после исследования, играя с запросами и проводя онлайн-исследования, я обращаюсь к вам за информацией.Ждем ваших ответов!Я пытаюсь написать это в общих чертах, поскольку я ищу общие идеи о том, как это сделать, а не точные утверждения.Если этот вопрос получен плохо, я с радостью переделываю его, дайте мне знать.Вот и мы:

У меня есть две таблицы:

  • Таблица 1 содержит 10 записей MIO.Он содержит только один столбец:
    • Столбец A: уникальный идентификатор (текст, например, «5uz1g09aksmsd»)
  • Таблица 2 содержит 300 записей MIO.Он имеет два столбца:
    • Столбец A: уникальный идентификатор (текст, например, '5uz1g09aksmsd')
    • Столбец B: номер (например, 32.5432)

Пока нет индексов и т. Д., Даже ПК, поскольку обе таблицы были только что созданы с помощью CTAS.Обе таблицы были проанализированы.

Сейчас я ищу быстрый запрос (подготовительная работа, например, создание индекса может занять время, без проблем), чтобы создать третью таблицу, содержащую 10 строк MIO таблицы 1,и столбец B таблицы 2, если совпадение найдено через столбец A (для 99% совпадение будет найдено).Чтобы было понятнее, простой CTAS может быть следующим:

create table3 as
select t1.a, 
    (select t2.b from table2 t2 where t2.a = t1.a and rownum = 1)
    -- the rownum = 1 is to show Oracle that there can only be one match
from table1 t1;

Это не так быстро, как может быть (я надеюсь).Каковы ваши идеи, чтобы сделать это быстрее?Создание индексов?Какие?Какое объединение вы хотели бы видеть в плане выполнения?Хеш-соединение?Я уже нашел

  • создание таблицы nologging
  • параллельное выполнение запроса и создание параллельной таблицы

Но меня интересуют особенности того, как идеальный план выполненияэто будет выглядеть с учетом того, что нам разрешено изменять систему (например, создавать индекс).В частности, я прошу 11gR2, но комментарии 12c также приветствуются.

1 Ответ

0 голосов
/ 20 ноября 2018

Начните с самой простой возможности, используя этот запрос

create table c as 
select /*+ parallel(6) */ a.a, b.b 
from a 
left outer join b
on a.a = b.a
;

Он будет использовать хеш-соединение, скорректировать параллельную степень в зависимости от настроек вашего оборудования.

Ожидаемый план выполнения выглядит следующим образом

    --------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT           |          |   261M|  6238M| 56799   (1)| 00:03:48 |        |      |            |
|   1 |  PX COORDINATOR                  |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)            | :TQ10002 |   261M|  6238M| 31984   (1)| 00:02:08 |  Q1,02 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT                | C        |       |       |            |          |  Q1,02 | PCWP |            |
|*  4 |     HASH JOIN OUTER              |          |   261M|  6238M| 31984   (1)| 00:02:08 |  Q1,02 | PCWP |            |
|   5 |      PX RECEIVE                  |          |  7849K|    44M|   726   (1)| 00:00:03 |  Q1,02 | PCWP |            |
|   6 |       PX SEND HASH               | :TQ10000 |  7849K|    44M|   726   (1)| 00:00:03 |  Q1,00 | P->P | HASH       |
|   7 |        PX BLOCK ITERATOR         |          |  7849K|    44M|   726   (1)| 00:00:03 |  Q1,00 | PCWC |            |
|   8 |         TABLE ACCESS STORAGE FULL| A        |  7849K|    44M|   726   (1)| 00:00:03 |  Q1,00 | PCWP |            |
|   9 |      PX RECEIVE                  |          |   261M|  4741M| 31149   (1)| 00:02:05 |  Q1,02 | PCWP |            |
|  10 |       PX SEND HASH               | :TQ10001 |   261M|  4741M| 31149   (1)| 00:02:05 |  Q1,01 | P->P | HASH       |
|  11 |        PX BLOCK ITERATOR         |          |   261M|  4741M| 31149   (1)| 00:02:05 |  Q1,01 | PCWC |            |
|  12 |         TABLE ACCESS STORAGE FULL| B        |   261M|  4741M| 31149   (1)| 00:02:05 |  Q1,01 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("A"."A"="B"."A"(+))

Мой тест с синтетическими данными вашего размера составляет 35 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...