相交两个表,大小为500ml的垂直行

问题描述 投票:0回答:3

我对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
)

所以我的问题是:

  1. Vertica中是否还有其他/更好的选项可以只获取两个表之间的已更改行?还是我应该甚至考虑在vertica端进行此比较?
  2. 进行这种比较应该花费多少?
  3. 我应该考虑如何改善这种查询的性能?
sql etl database-performance query-performance vertica
3个回答
1
投票

如果您的列没有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

我想这会有合理的表现。


1
投票

您也可以使用连接很好地做到这一点:

select b.*
from tableB b
except
select a.*
from tableA a;

所以上面的查询仅返回从TableB到TableA的差异,即两个表中都存在的数据将被跳过...


0
投票

两个表中都有主键吗?

然后,为了获得完整的变更数据捕获,我的技术是:

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的最后一腿

祝你好运

© www.soinside.com 2019 - 2024. All rights reserved.