CREATE TABLE AS SELECT имеет плохую производительность в Vertica - PullRequest
1 голос
/ 17 июня 2019

В настоящее время мы перемещаем нашу СУБД в vertica, но у нас возникают проблемы с обработкой дубликатов.В MySQL мы просто использовали INSERT IGNORE.Дубликаты в нашем потоке ввода данных должны быть отфильтрованы на уровне базы данных.Я реализовал это, имея таблицу tableName_import без ограничений, которая будет использоваться для хранения всех данных.В другой таблице tableName_dedup содержатся только данные без дубликатов.

CREATE TABLE IF NOT EXISTS tableName_dedup
AS SELECT column1, column2, ...
FROM (SELECT *, row_number OVER (PARTITION BY column1, column2)
as rownum FROM tableName_import) import
where import.rownum = 1;

В таблице tableName_import содержится примерно 1,5 миллиона записей с 2 ​​ГБ данных.Создание таблицы tableName_dedup занимает около 10 минут.

Есть ли способ повысить производительность?

edit: в таблице импорта есть один столбец VARCHAR(50000),Когда я удаляю этот столбец, запрос выполняется за считанные секунды.Почему этот столбец так сильно замедляет запрос?

1 Ответ

1 голос
/ 17 июня 2019

Работайте с машиной, а не против нее.

INSERT ... IGNORE - это очень специфический и не интуитивно понятный тип предложения, поэтому его поддерживают лишь немногие базы данных.

Команда MERGEвстречается гораздо чаще, и вы можете просто пропустить предложение WHEN MATCHED THEN UPDATE, например, так:

MERGE /*+DIRECT*/ 
INTO  d_teas_scd  t 
USING d_teas_stg  s
   ON s.tea_key = t.tea_key
WHEN NOT matched THEN INSERT (
  tea_key
, tea_id
, tea_eff_dt
, tea_end_dt
, tea_name
, tea_price
) VALUES (
  s.tea_key
, s.tea_id
, s.tea_eff_dt
, s.tea_end_dt
, s.tea_name
, s.tea_price
);

А если вы хотите использовать функции OLAP - тогда попробуйте аналитическое предложение LIMIT, которое, я думаю,, уникальный для Vertica, и звучит так:

SELECT
  *
FROM d_teas_scd
LIMIT 1 OVER(PARTITION BY tea_id ORDER BY tea_eff_dt DESC)
;

Довольно эффективно ...

Удачи -

...