2017-10-28 158 views
2

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

+0

是否有可能打破你的查询到更小的部分? – timothyclifford

+0

您能否澄清一下查询的部分内容? –

+0

是否直接提供in子句 - 即生成非常大的sql select语句,然后提交它?并且 - 这是否需要作为单个select语句运行,还是可以运行多个sql步骤? –

回答

1

如果你有控制你是如何生成的代码,您可以按如下

第一代码提交,删除并重新创建过滤器表拆分起来:

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; 
+0

嗨,乔恩,在插入方面不是红移很慢? 这种方法不会减慢整个过程吗? –

+0

是的,它会慢一些,但是我不能想到一个更大的子句更快的选择。 –

0

大,是不最佳做法本身,最好使用加入大型列表:

  1. 构造虚拟表子查询
  2. 加入你的目标表虚表

这样

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 
+0

我不知道我是否可以采用这种方法,因为我们在“IN”子句中传递的数据在从其他表中获取并在其上执行一些操作/验证后检索。这个处理部分目前是用Java编写的。 原因,我不愿意将这个处理部分移到sql是因为它会极大地增加查询复杂度,这会影响查询的可理解性。 –

+0

@GaganMaheshwari如果我正确理解这一点,那么没有问题,您可以使用Java生成此子查询 - 而不仅仅是发送列表发送子查询 – AlexYes

+0

您可以详细说明如何在Java中生成子查询? –