2012-05-17 5 views
0

Я хотел бы написать заявление MERGE в базе данных Vertica. Я знаю, что его нельзя использовать напрямую, а вставка/обновление должно быть в сочетании, чтобы получить желаемый эффект.MERGE in Vertica

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

MERGE INTO table c USING (select b.field1,field2 aeg from table a, table b 
where a.field3='Y' 
and a.field4=b.field4 
group by b.field1) t 
    on (c.field1=t.field1) 
    WHEN MATCHED THEN 
     UPDATE 
     set c.UUS_NAIT=t.field2; 

просто хотел бы увидеть пример MERGE используется в качестве вставки/обновления.

+0

Привет, вы можете использовать коррелированное соединение для обновления своих строк. Он имеет [намного лучшую производительность, чем «MERGE») (http://vertica.tips/2014/06/23/merge-vs-correlated-join/). – Kermit

ответ

4

Вы действительно не хотите делать обновления в Vertica. Вставка в порядке. Выбирается в порядке. Но я очень рекомендую держаться подальше от всего, что обновляет или удаляет.

Система оптимизирована для чтения больших объемов данных и для вставки больших объемов данных. Поэтому, поскольку вы хотите сделать операцию, которая делает 1 из 2, я бы посоветовал это сделать.

Как вы заявили, вы можете разбить заявление на вставку и обновление.

То, что я рекомендовал бы, не зная подробностей о том, что вы хотите сделать, так это может быть изменена:

1) Вставка данных из внешнего источника в промежуточную таблицу.
2) Выполните и INSERT-SELECT из таблицы в таблицу, которую вы хотите, используя критерии, о которых вы думаете. Либо использование соединения, либо двух операторов с подзапросами в таблице, с которой вы хотите протестировать.
3) Усекайте промежуточный стол.

Кажется запутанным, я думаю, но вы действительно не хотите делать UPDATE. И если вы считаете, что это хлопот, пожалуйста, помните, что причиной этой проблемы является то, что дает вам прибыль в операторах SELECT.

2

Мне нравится ответ geoff в целом. Это кажется противоречивым, но вы получите лучшие результаты, создавая новую таблицу с нужными вам строками или изменяя существующую.

Это означает, что это будет стоить только после того, как стол пройдет мимо определенного размера или пройдет определенное количество ОБНОВЛЕНИЙ. Если вы говорите о таблице 1mil строк, я могу рискнуть и сделать обновления на месте, а затем очистить, чтобы избавиться от надгробных строк.

0

Чтобы быть ясным, Vertica не очень хорошо подходит для однострочных обновлений, но большие массовые обновления намного меньше. Я бы не рекомендовал повторное создание всей таблицы, я бы рассмотрел стратегии вокруг воссоздания разделов или массовых обновлений из промежуточных таблиц.

3

Если вы хотите привести пример оператора MERGE, перейдите по ссылке. Это ссылка на документацию Vertica. Не забудьте четко следовать инструкциям. Вы не можете написать слияние с WHEN NOT MATCHED и WHEN MATCHED. Он должен следовать последовательности, указанной в описании использования в документации (это наоборот). Но вы можете полностью отказаться от него.

Я не уверен, если вы знаете о том, что в Vertica данные, которые обновляются или удаляются, на самом деле не удаляются из таблицы, а просто помечены как «удаленные». Этот вид данных можно удалить вручную, выполнив: SELECT PURGE_TABLE ('schemaName.tableName');

Возможно, вам потребуются права суперпользователя, чтобы сделать это на этой схеме. Подробнее об этом можно прочитать здесь: Vertica Documentation; Purge Data. Примером этого является сайт Vertica: Update and Insert Simultaneously using MERGE

Я согласен, что Merge поддерживается в версии Vertica 6.0. Но если настройки управления AHM или эпохи Vertica настроены на сохранение большого количества исторических (удаленных) данных, это замедлит ваши обновления. Скорости обновления могут исходить из того, что плохо, а хуже того, ужасно.

Что я обычно делаю, чтобы избавиться от удаленных (старых) данных, запустите очистку таблицы после обновления таблицы. Это помогло поддерживать скорость обновлений. Слияние полезно, когда вам обязательно нужно запускать обновления. Особенно инкрементные ежедневные обновления, которые могут обновлять миллионы строк.

Получение ответа: я не думаю, что Vertica поддерживает подзапрос в слиянии. Вы получите следующее.

ERROR 0: Subquery in MERGE is not supported 

Когда я был подобный потребительной случай, я создал представление, используя подзапрос и объединены в таблицу назначения, используя только что созданный вид, как мой исходной таблицы. Это должно позволить вам продолжать использовать операции MERGE в Vertica, и регулярные PURGE должны позволить вам быстро обновлять свои обновления.

На самом деле объединение также помогает избежать дублирования записей во время вставок или обновлений, если вы используете правильную комбинацию полей в предложении ON, что в идеале должно быть соединением первичных ключей.

+0

Что делать, если стоечный стол отбрасывается и воссоздается с тем же именем? Будет ли vertica хранить старые данные таблицы и добавлять ее (что приводит к росту данных)? – BlackHat