Redshift large' in'条款最佳做法

时间:2017-10-28 08:50:48

标签: amazon-redshift

我们有一个查询,其中参数值列表在" IN"中提供。查询的子句。一段时间后,这个查询无法按照" IN"中的数据大小执行。子句变得非常大,因此生成的查询超出了REDSHIFT中查询的16 MB限制。结果,我们尝试批量处理数据,以限制数据,而不是超过16 MB的限制。 我的问题是在为" IN"提供如此大的数据时要记住的因素/陷阱是什么?查询的子句或者是否有任何替代方法可以处理" IN"条款?

2 个答案:

答案 0 :(得分:1)

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

要提交的第一个代码,删除并重新创建过滤器表:

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;

答案 1 :(得分:0)

大IN本身并不是最佳实践,最好使用大型列表的连接:

  1. 构建一个子查询的虚拟表
  2. 将目标表加入虚拟表
  3. 像这样

    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