假設我有對證100000分的UID爲一個更新語句 - 目前我的代碼將闖入1000 UID塊這樣的:單個Oracle語句中OR子句的最大數量是多少?
[...] WHERE UID IN (..., '998', '999', '1000')
OR UID IN ('1001', '1002', ...)
OR (..., etc., ...)
有沒有你可以有最大數量的OR子句?也就是說,在我上面的例子中,它會生成100個OR子句,每個子句有1000個IN子句。
假設我有對證100000分的UID爲一個更新語句 - 目前我的代碼將闖入1000 UID塊這樣的:單個Oracle語句中OR子句的最大數量是多少?
[...] WHERE UID IN (..., '998', '999', '1000')
OR UID IN ('1001', '1002', ...)
OR (..., etc., ...)
有沒有你可以有最大數量的OR子句?也就是說,在我上面的例子中,它會生成100個OR子句,每個子句有1000個IN子句。
好了,不完全是。這就是1000項IN列表的多少個OR子句將在我的系統上運行,但是這個數字可能對每個人都不相同。有 沒有database limit正好覆蓋了這種情況。它可能是下注落在:
上的SQL語句可以持續多久的限制取決於許多因素, 包括數據庫配置,磁盤空間和內存
當我嘗試23,我在SQL得到這個錯誤*加:
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 2452
Session ID: 135 Serial number: 165
這不是真正的錯誤,只是意味着在服務器崩潰和SQL * Plus失去了聯繫。奇怪的是,當我查看警報日誌時,沒有錯誤。有跟蹤文件,但仍然沒有ORA-錯誤消息。我看到的只有上百行:
*** 2013-11-04 21:59:48.667
minact-scn master-status: grec-scn:0x0000.00821c54 gmin-scn:0x0000.0081d656 gcalc-scn:0x0000.00821c54
minact-scn master-status: grec-scn:0x0000.00823b45 gmin-scn:0x0000.0081d656 gcalc-scn:0x0000.00823b46
這裏的教訓是避免可笑的大型SQL語句。您必須以另一種方式來完成,比如將數據加載到表中。而不要試圖建立一些只是夠小。它今天可能工作,但明天會在不同的環境中失敗。
--Find the maximum number of IN conditions with 1000 items.
--Change the first number until it throws an error.
--This code uses dynamic SQL, but I found that static SQL has the same limit.
declare
c_number_of_ors number := 22;
v_in_sql varchar2(4000);
v_sql clob;
v_count number;
begin
--Comma-separate list of 1000 numbers.
select listagg(level, ',') within group (order by 1)
into v_in_sql
from dual connect by level <= 1000;
--Start the statement.
v_sql := 'select count(*) from dual ';
v_sql := v_sql || 'where 1 in ('||v_in_sql||')';
--Append more ORs to it.
for i in 1 .. c_number_of_ors loop
v_sql := v_sql || ' or '||to_char(i)||' in ('||v_in_sql||')';
end loop;
--Execute it.
execute immediate v_sql into v_count;
end;
/
很好的答案 - +1! – MrDuk
在單個查詢中沒有任何OR子句的限制。當您使用GROUP BY子句時,以及通常所有必須適合單個數據庫塊的非直接聚合函數(例如SUM,AVG)時,您可能會遇到限制問題。
您是否恰好擁有這方面信息的來源? – MrDuk
我會把UID的另一個表,並在更新語句加入。 – acfrancis
這些100,000個用戶從哪裏來?當然,這些值存儲在數據庫的某個地方,對吧?如果是這樣,那麼可以使用在您的IN語句中返回UID值的查詢,而不是顯式列出100,000個獨立的文字值。 –
在這個過程的不同部分,100,000個使用者都被安裝到一個deque上 - 在這種情況下,不能真正做到這一點。 – MrDuk