2017-02-07 18 views
0

У меня есть таблица A в Vertica с 50 столбцами и в таблице Impala B с 20 столбцами. Таблица A, имеющая дату миллионов миллионных записей, и хочет обновить эти записи от impala один раз в день в течение определенного дня. Поскольку я использую java, я обновляю 1000 партию через коллекцию за 1 миллионную запись, но занимает больше времени, иногда день. Я также попытался создать новую копию таблицы A для определенного дня и обновить ее, а затем снова вставить все записи в A. Но никакого эффекта производительности.Обновление огромной записи в vertica от impala

Что может быть лучшим подходом к тому же, чтобы я мог выполнять одну и ту же задачу за меньшее время?

ответ

0

Создать стол B в Вертице с 20 колоннами, как в импале.

Создайте Java-программу, которая соединяет как с impala, так и с Vertica. В этой программе объем читается SELECT * FROM impala.B в массивы в памяти и использует ту же память, что и переменные хоста для целевого оператора INSERT /*+DIRECT */ INTO vertica.B VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?).

Создать (или сохранить) таблицу stg_A промежуточной с той же структурой и тот же первичный ключ (в идеале один столбец), как 50-Col таблицы А.

Truncate промежуточной таблицы, затем INSERT /*+DIRECT */ INTO stg_A SELECT B.*, A.col21,A.col22 .... A.col50 FROM B JOIN A ON stg_A.id=A.id (если это id первичный ключ). Это гарантирует, что 20 столбцов исходят от импалы, а остальное - от цели.

Наконец, запустить оптимизированное слияние:

MERGE /*+DIRECT*/ 
INTO A t 
USING stg_A s 
ON s.id   = t.id 
WHEN MATCHED THEN UPDATE SET 
    id = s.id 
, col02 = s.col02 
, col03 = s.col03 
, col04 = s.col04 
, col05 = s.col05 
[...]  
    , col50 = s.col50 
WHEN NOT MATCHED THEN INSERT VALUES (
    s.s.id 
, s.s.col02 
, s.s.col03 
, s.s.col04 
, s.s.col05 
, s.[...] 
, s.s.col50 
); 

Вы увидите, что ваше слияние является оптимизированным слиянием, когда объяснить план имеет полный путь доступа для вставки и полного пути доступа к УДАЛИТЬ, и нет доступа путь для MERGE.

+0

Привет, Спасибо за ответ. Я пробовал другой способ, как select * from impala и создать таблицу в vertica temp с теми же столбцами выше select * и вставить все значения в temp. Затем обновите vertica B, сравнивая temp с соединением на аналогичных ключах и условием одиночного запроса даты. Просто проверяем производительность сейчас. –

+0

Теперь он работает нормально ... UPDATE A ts SET column1 = t.column1 FROM temp t WHERE ts.column2 = t.column2 И ts.column3 = t.column3 и date (ts. column4) = '2017-02-08'; –

+0

Это было бы даже быстрее с оптимизированным MERGE. Прочтите документацию. ... – marcothesane