簡體   English   中英

重寫大型IN子句的最佳性能是什么?

[英]What is the most performant way to rewrite a large IN clause?

我使用go和gorm編寫了一個API,它在我們的數據庫上運行計算並返回結果。

我剛剛在使用聚合時達到IN條件的參數限制。 示例查詢:

SELECT SUM(total_amount) from Table where user_id in(...70k parameters) group by user_id

我目前的一個邊緣案例有> 65535個用戶ID,所以我的Postgres客戶端拋出一個錯誤:

 got 66037 parameters but PostgreSQL only supports 65535 parameters 

我不確定最好的辦法是什么。 一個將處理此邊緣情況的大量參數,同時不影響我的典型用例。 我是否對id進行分塊並迭代多次查詢將其存儲在內存中,直到我擁有所需的所有數據? 使用ANY(VALUES) ......

顯然,從查詢中我對Postgres的知識非常有限,所以任何幫助都會令人難以置信地受到贊賞。

您可以使用以下方法之一替換user_id IN (value [, ...])

user_id IN (subquery)
user_id = ANY (subquery)
user_id = ANY (array expression)

子查詢和數組都沒有表現出相同的限制。 最短的輸入語法是:

user_id = ANY ('{1,2,3}'::int[])  -- make array type match type of user_id

詳細信息和更多選項:

或者您可以創建一個(臨時)表tmp_usr(user_id int) ,導入到它,可能使用SQL COPY或psql \\copy而不是INSERT以獲得最佳性能和非常大的集合 ,然后加入到表中,如:

SELECT SUM(total_amount)
FROM   tbl
JOIN   tmp_usr USING (user_id)
GROUP  BY user_id;

BTW, GROUP BY user_idSELECT列表中不包括user_id看起來很可疑。 可能是一個簡化的示例查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM