我尝试使用merge将聚合数据向上插入到表集合中。对于每个表,有些字段可为空,有些字段不可为空。fielda和fieldb上声明了两个主键。当我运行merge语句时,我收到一个“join中检测到重复的合并键”错误。有人能帮我解决这个问题吗。
注意:当我截短目标表时,如果我在temp表中的fieldc或fieldd上执行任何更新操作,然后运行merge query,它的工作正常。但下一次在临时表中的fieldc或fieldd上发生任何更新操作,然后运行合并查询时,它会给出这个错误。
伪语法示例:
CREATE TABLE target (
fieldA varchar,
fieldB varchar,
fieldC varchar null,
fieldD int not null,
FieldE int,
Constraint target_pk primary key(fieldA, fieldB));
CREATE TABLE temp (
fieldA varchar,
fieldB varchar,
fieldC varchar null,
fieldD int not null,
fieldE int,
Constraint temp_pk primary key(fieldA, fieldB));
MERGE INTO target trg
USING temp tmp ON (
trg.FieldA = tmp.FieldA
AND trg.FieldB = tmp.FieldB)
WHEN MATCHED THEN UPDATE
SET fieldC = tmp.fieldC ,
fieldD= tmp.fieldD,
fieldE=temp.fieldE
WHEN NOT MATCHED THEN INSERT (
FieldA ,
FieldB ,
FieldC ,
fieldD,
fieldE)
VALUES (
tmp.FieldA ,
tmp.FieldB ,
tmp.FieldC ,
tmp.fieldD,
tmp.fieldE);
1条答案
按热度按时间eit6fx6z1#
一开始,目标表是空的,它甚至没有包含数据的投影。这样,访问计划就变成了一个简单的插入。事实上,当你用一个空的目标和一个完整的源来解释合并时,你会得到一个空的解释计划。
用空表解释:
现在,我执行第一次合并,并提交:
我再解释一下合并:
现在你看到有一个
DML MERGE
操作,从JOIN MERGEJOIN
操作。当你截断
target
,投影仍保留,但为空。事实上你得到了第二个版本的EXPLAIN
当目标表被截断,但确实有投影时也是如此。你发现了vertica的一个特点,那是因为它是一个性能优化的大数据平台。
默认情况下,表上的约束是
DISABLED
,如果要启用它,则必须ALTER TABLE ENABLE CONSTRAINT ...
-这样就大大降低了海量数据的处理速度。在禁用主键约束的情况下,可以插入重复项,但后续的
JOIN
使用目标表的主键列OUTER
explain计划中的表-将尝试利用构建计划中的唯一性-如果遇到重复的键,它将失败。它成功的外部、目标、表为空。因此,与包含重复键的完整目标的合并失败。
删除重复项时需要帮助吗?有一堆贴有[vertica]标签的帖子在处理这个问题。。。