我們有一個查詢,其中查詢的「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. 紅移:「IN子句」中的最大項?
- 2. if/else語句的最佳做法javascript
- 3. 大量if/else語句的最佳做法
- 4. 大JavaScript對象的最佳做法
- 5. Android佈局大小最佳做法
- 6. 命名子類的最佳做法
- 7. RabbitMQ - 最佳做法
- 8. 最佳做法response.getOutputStream
- 9. estimatedHeightForRowAtIndexPath最佳做法
- 10. 最佳做法applicationDidEnterBackground
- 11. 最佳做法UIScrollView
- 12. ActionListener最佳做法
- 13. CLLocationManager最佳做法
- 14. SQL Server - 規避大型IN(...)子句(> 40000項)的最佳實踐
- 15. 索引句子的最佳算法
- 16. JavaMail編程最佳或最佳做法
- 17. SQL Server查詢的最大大小? IN子句?有沒有更好的辦法
- 18. 什麼是使用JDBC來參數化IN子句的最佳方法?
- 19. 替換三元零檢查與紅寶石的最佳做法
- 20. 紅寶石在軌道上。月度訂閱最佳做法
- 21. 類的最佳做法
- 22. Ember ArrayProxy的最佳做法
- 23. UIViewController最佳做法 - 加載
- 24. C#繼承最佳做法
- 25. SharePoint列表最佳做法
- 26. 以最佳做法登錄?
- 27. 動畫最佳做法
- 28. Rails的最佳做法
- 29. 類別最佳做法
- 30. Sqlite的最佳做法Android
是否有可能打破你的查詢到更小的部分? – timothyclifford
您能否澄清一下查詢的部分內容? –
是否直接提供in子句 - 即生成非常大的sql select語句,然後提交它?並且 - 這是否需要作爲單個select語句運行,還是可以運行多個sql步驟? –