我对vertica数据库非常陌生,因此正在寻找不同的有效方法来比较vertica中两个平均大小为500ml-800ml的行的表。我有一个从vertica视图获取数据并将其转储到SQL Server以便以后合并到sql server中的最终表的过程。对于几个大表组合,它每天要转储大约3bl行。我不想转储所有数据,而是想获取每日快照,并且仅将其与vertica端的前几天快照进行比较,然后仅将更改的行推入SQL SEREVER。
假设以前的快照存储在表A中,今天的快照存储在表B中。这两个表上的PK都是名为OrderId的列。
我想到的最简单的方法是
Select * from tableB
Where OrderId NOT IN (
SELECT * from tableA
INTERSECT
SELECT * from tbleB
)
所以我的问题是:
如果您的列没有NULL
值,那么似乎很大的LEFT JOIN
似乎可以满足您的要求:
select b.*
from tableB b left join
tableA a
on b.OrderId = a.OrderId and
b.col1 = a.col1 and
. . . -- for all the columns you care about
但是,我认为您想要except
:
except
我想这会有合理的表现。
您也可以使用连接很好地做到这一点:
select b.*
from tableB b
except
select a.*
from tableA a;
所以上面的查询仅返回从TableB到TableA的差异,即两个表中都存在的数据将被跳过...
两个表中都有主键吗?
然后,为了获得完整的变更数据捕获,我的技术是:
SELECT b.*
FROM tableB AS b
LEFT JOIN tableA AS a ON a.id = b.id
WHERE a.id IS NULL
如果不想满足DELETE('D'),只需忽略UNION SELECT的最后一腿
祝你好运