[英]What is the most performant way to rewrite a correlated subquery in the SELECT clause?
[英]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_id
在SELECT
列表中不包括user_id
看起來很可疑。 可能是一個簡化的示例查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.