簡體   English   中英

SQL IN Query是更好的性能還是Java方法ContainsAll

[英]Is SQL IN Query better for performance or Java method ContainsAll

我有一個場景,用戶將選擇最多10萬個條目的大量輸入,並且我需要驗證此數據是否屬於該用戶並滿足其他X條件,因此我應該使用復雜的Oracle SQL DB查詢-復合IN(id,column)來驗證它或

我是否應該為此用戶獲取滿足應用程序內存條件的數據並使用List.containsAll,首先獲取該特定用戶的所有數據(以及所有其他條件),然后將其填充到dbList中,然后驗證dbList.containsAll( inputList)。

哪一個會更好地表現明智。 DB Composite IN發送批量輸入vs獲取輸入並使用containsAll對其進行驗證

我嘗試在SIT環境中運行SQL查詢,該查詢大約需要70 -90秒,這太糟糕了。 在生產中會更好,但是我仍然覺得即使必須通過用戶ID索引數據也必須對數據庫中的大量數據進行排序。

我在IN DB中使用Count(*)和IN如下所示:

SQL Query :
select count(*) from user_table where user_id='X123' and X condtions  and user_input IN(
('id','12344556'),
('id','789954334')
('id','343432443')
('id','455543545')
------- 50k entries
);

此外,還有其他用於驗證user_input的AND條件是有效條目。

示例JAVA代碼:

List<String> userInputList = request.getInputList();
List<String> userDBList = sqlStatement.execute(getConditionedQuery);
Boolean validDate = userDBList.containsAll(userInputList );

getConditionedQuery = "select user_backedn_id from user_table where user_id='X123'AND X complex conditions";

在較低的環境中,帶有復合IN條件的SQL查詢大約需要70-90秒,但是containsALL的Java代碼看起來要快得多。

順便說一句,我不想​​使用臨時表並執行該過程,因為再次在DB中進行批量輸入條目很麻煩。 我正在使用ATG框架,並且該模塊是RESTful的,因此性能在這里至關重要。

我個人認為,出於多種原因,應僅在數據庫端應用所有過濾器。 首先,通過網絡交換大量數據將消耗不必要的帶寬。 其次,將所有數據導入JVM並對其進行處理將消耗更多內存。 第三,可以針對復雜查詢優化和優化數據庫。 與您的DBA交談,給他查詢並讓他運行分析。 該分析將告訴您是否需要添加任何索引來優化查詢。

另外,與您的想法相反,我的經驗表明,如果查詢在SIT中花費70-90秒,那么在生產中將花費更多時間。 因為盡管PROD機器更快,但是PROD中的數據量比SIT高得多,因此將花費更長的時間。 但這並不意味着您應該在網絡上拖拉它並在JVM中對其進行處理。 此外,與數據庫內存相比,JVM的堆內存要少得多。

此外,隨着我​​們轉向支持雲的容器化應用程序體系結構,網絡帶寬需要收費。 例如,如果您的應用程序在雲中並且數據庫在內部,則想象一下您要來回移動的數據量,以最終從一百萬行中篩選出10行。

我建議您編寫一個好的查詢,對其進行優化並僅在數據庫端處理盡可能多的條件。 希望能幫助到你 !

通常,將盡可能多的處理推送到數據庫是一個好主意。 盡管它實際上可能是一個瓶頸,但它通常已經過優化,並且可以比您更快地處理大量數據。

對於您所描述的讀取查詢,您甚至可以卸載工作以讀取副本,因此不會使主數據庫不堪重負。

暫無
暫無

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

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