我们有一个查询,其中查询的“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中生成子查询? –
- 1. 大JavaScript对象的最佳做法
- 2. Android布局大小最佳做法
- 3. 命名子类的最佳做法
- 4. 最佳做法response.getOutputStream
- 5. 最佳做法UIScrollView
- 6. 最佳做法applicationDidEnterBackground
- 7. estimatedHeightForRowAtIndexPath最佳做法
- 8. 索引句子的最佳算法
- 9. SQL Server查询的最大大小? IN子句?有没有更好的办法
- 10. 什么是使用JDBC来参数化IN子句的最佳方法?
- 11. 红宝石在轨道上。月度订阅最佳做法
- 12. 替换三元零检查与红宝石的最佳做法
- 13. Facebook - “IN”子句中的最大参数数量?
- 14. IN子句
- 15. PouchDB - IN子句
- 16. C#继承最佳做法
- 17. 最佳做法__unicode __(self)
- 18. Math.Pow的最佳做法
- 19. 最佳做法有记录
- 20. infinity.js的最佳做法
- 21. Single SignOn - 最佳做法
- 22. OOP - 最佳做法/性能
- 23. 黄瓜最佳做法
- 24. Sqlite的最佳做法Android
- 25. Wpf动画最佳做法
- 26. Javascript提示:最佳做法?
- 27. viewDidUnload中的最佳做法?
- 28. Rails的最佳做法
- 29. ImageView点击最佳做法
- 30. 最佳做法在MVC
是否有可能打破你的查询到更小的部分? – timothyclifford
您能否澄清一下查询的部分内容? –
是否直接提供in子句 - 即生成非常大的sql select语句,然后提交它?并且 - 这是否需要作为单个select语句运行,还是可以运行多个sql步骤? –