红移大“in”子句最佳做法
我们有一个查询,其中查询的“IN”子句中提供了参数值列表。一段时间后,由于“IN”子句中的数据大小变得非常大,因此查询结果超过了REDSHIFT中查询的16MB限制,因此该查询无法执行。因此,我们尝试分批处理数据,以限制数据并且不违反16 MB的限制。 我的问题是在为查询的“IN”子句提供如此大的数据时需要记住哪些因素/缺陷,或者是否有其他方法可以处理“IN”子句中的大数据?红移大“in”子句最佳做法
如果你有控制你是如何生成的代码,您可以按如下
第一代码提交,删除并重新创建过滤器表拆分起来:
drop table if exists myfilter;
create table myfilter (filter_text varchar(max));
第二步是将过滤器表填充到合适大小的部分,例如
insert into myfilter
values({{myvalue1}},{{myvalue2}},{{myvalue3}} etc etc up to 1000 values);
重复上述步骤多次,1000个值在一个时间你把所有的值插入
在此之前,使用该过滤器表如下
select * from master_table
where some_value in (select filter_text from myfilter);
drop table myfilter;
嗨,乔恩,在插入方面不是红移很慢? 这种方法不会减慢整个过程吗? –
是的,它会慢一些,但是我不能想到一个更大的子句更快的选择。 –
大,是不最佳做法本身,最好使用加入大型列表:
- 构造虚拟表子查询
- 加入你的目标表虚表
这样
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”子句中传递的数据在从其他表中获取并在其上执行一些操作/验证后检索。这个处理部分目前是用Java编写的。 原因,我不愿意将这个处理部分移到sql是因为它会极大地增加查询复杂度,这会影响查询的可理解性。 –
@GaganMaheshwari如果我正确理解这一点,那么没有问题,您可以使用Java生成此子查询 - 而不仅仅是发送列表发送子查询 – AlexYes
您可以详细说明如何在Java中生成子查询? –
是否有可能打破你的查询到更小的部分? – timothyclifford
您能否澄清一下查询的部分内容? –
是否直接提供in子句 - 即生成非常大的sql select语句,然后提交它?并且 - 这是否需要作为单个select语句运行,还是可以运行多个sql步骤? –