2017-10-28 131 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中生成子查詢? –