我正在使用 postgres java jdbc 驅動程式。當我SELECT * FROM mytable where (pk1, pk2, pk3) in ((?,?,?),(?,?,?).....)使用 ~20k 復合 id(即 ~60k 占位符)進行大批量查詢時,會彈出此錯誤。
例外的呼叫堆疊:
org.postgresql.util.PSQLException: ERROR: stack depth limit exceeded
Hint: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2552)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2284)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
at io.agroal.pool.wrapper.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:78)
...
這看起來像是服務器端錯誤。這很棘手,因為:
- 我很難配置服務器端的東西......
- 即使我可以配置它,但很難知道“會炸毀服務器端堆疊的查詢有多大”
對此有何想法?或者進行如此大的 id 查詢的最佳實踐是什么。
uj5u.com熱心網友回復:
我不確定IN子句的最大條目數(1000?),但它小于 20K。處理這么多的常用方法是創建一個臨時表,在這種情況下包含變數。然后呼叫 v1、v2、v3。現在從檔案 (CSV) 加載臨時表,然后使用:
select *
from mytable
where (pk1, pk2, pk3) in
(select v1,v2,v3
from staging_table
);
使用這種格式,暫存表中的專案沒有限制。一旦程序完成truncate,臨時表為下一個周期做準備。
uj5u.com熱心網友回復:
我不確定IN子句的最大條目數(1000?),但它小于 20K。處理這么多的常用方法是創建一個階段表,在這種情況下包含變數。然后呼叫 v1、v2、v3。現在從檔案 (CSV) 加載階段表,然后使用: select * from mytable where (pk1, pk2, pk3) in (select v1,v2,v3 from staging_table
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321687.html
標籤:sql PostgreSQL 数据库
上一篇:EfCoreTrigrams相似距離實作-在EFCorePostgreSQL/npgsql中匯入失敗
下一篇:帶有“FOR...IN”回圈“記錄”變數/迭代器的“EXECUTEFORMAT”中的什么識別符號使用點/句點“。”PLPGSQL程序中的列名?
