Amazon redshift 红移大“in”条款最佳实践

Amazon redshift 红移大“in”条款最佳实践,amazon-redshift,Amazon Redshift,我们有一个查询,其中在查询的in子句中提供了参数值列表。一段时间以前,由于in子句中的数据大小变得相当大,因此该查询无法执行,因此结果查询超过了红移中查询的16 MB限制。因此,我们尝试分批处理数据,以限制数据,并且不超过16 MB的限制。 我的问题是,在为查询的in子句提供如此大的数据时,需要记住哪些因素/陷阱,或者是否有其他方法可以处理in子句的如此大的数据?如果您可以控制如何生成代码,您可以按如下方式将其拆分 select * from master_table where some_va

我们有一个查询,其中在查询的in子句中提供了参数值列表。一段时间以前,由于in子句中的数据大小变得相当大,因此该查询无法执行,因此结果查询超过了红移中查询的16 MB限制。因此,我们尝试分批处理数据,以限制数据,并且不超过16 MB的限制。
我的问题是,在为查询的in子句提供如此大的数据时,需要记住哪些因素/陷阱,或者是否有其他方法可以处理in子句的如此大的数据?

如果您可以控制如何生成代码,您可以按如下方式将其拆分

select * from master_table
where some_value in (select filter_text from myfilter);
drop table myfilter;
要提交的第一个代码,删除并重新创建筛选表:

drop table if exists myfilter;
create table myfilter (filter_text varchar(max));
第二步是以适当大小的部分填充筛选表,例如一次填充1000个值

insert into myfilter
values({{myvalue1}},{{myvalue2}},{{myvalue3}} etc etc up to 1000 values );
重复上述步骤多次,直到插入所有值

然后,使用该筛选表,如下所示

select * from master_table
where some_value in (select filter_text from myfilter);
drop table myfilter;

大IN本身不是最佳实践,最好对大列表使用联接:

在子查询中构造虚拟表 将目标表连接到虚拟表 像这样

with
your_list as (
    select 'first_value' as search_value
    union select 'second_value'
    ...
)
select ...
from target_table t1
join your_list t2
on t1.col=t2.search_value

是否可以将查询分解为更小的部分?能否请您进一步澄清分解查询的部分?您是否按字面意思提供in子句,即生成非常大的sql select语句,然后提交?和-这需要作为一个select语句运行还是可以运行多个sql步骤?嗨-我的答案对您有用吗?如果是,请将其标记为这样-如果不是,请让我知道为什么不。嗨,Jon,redshift在插入方面不是很慢吗?这种方法不会减慢整个过程吗?是的,它会更慢,但是我想不出一种更快的方法来替代非常大的in子句。我不确定是否可以采用这种方法,因为我们在in子句中传递的数据是在从其他表中获取并对其执行两次操作/验证后检索的。这个处理部分目前是用Java编写的。原因是,我不愿意将此处理部分移动到sql,因为它将极大地增加查询的复杂性,这将影响查询的可理解性。@GaganMaheshwari如果我理解正确,没有问题,您可以用Java生成此子查询-而不只是发送列表发送子查询您可以详细介绍如何用Java生成子查询吗?@GaganMaheshwari如果您说您有Java处理部分,我假设您的意思是您有一个Java应用程序在与Redshift来回对话,您正在用Java编写IN查询,并将其发送给Redshift执行。然后,您可以自由地使用此列表以上述方式构造查询,而不仅仅是使用列表。