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

时间:2019-03-31 10:59:15

标签: java sql

我有一个场景,用户将选择最多10万个条目的大量输入,并且我需要验证此数据是否属于该用户并满足其他X条件,因此我应该使用复杂的Oracle SQL DB查询-复合IN(id,列)以对其进行验证,或者

我应该为该用户获取满足应用程序内存条件的数据并使用List.containsAll,方法是首先获取该特定用户的所有数据(以及所有其他条件),然后将其填充到dbList中,然后验证dbList .containsAll(inputList)。

哪个人会表现更好。 DB Composite IN发送批量输入与获取输入并使用containsAll进行验证

我尝试在SIT环境中运行SQL查询,该查询大约需要70 -90秒,这太糟糕了。最好在产品中使用,但我仍然认为即使必须通过用户ID索引数据也必须对数据库中的大数据进行排序。

IN DB我正在将Count(*)与IN一起使用,如下所示:

Microsoft SQL Server\130\DTS\Binn

还有其他用于验证user_input的AND条件也是有效条目。

示例JAVA代码:

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
);

在较低的环境中,带有复合IN条件的SQL查询大约需要70-90秒,但是containsALL的Java代码看起来要快得多。

顺便说一句,我不想​​使用临时表并执行该过程,因为再次在DB中进行批量输入条目很麻烦。我正在使用ATG框架,并且该模块是RESTful的,因此性能在这里至关重要。

2 个答案:

答案 0 :(得分:2)

我个人认为,出于多种原因,应仅在数据库端应用所有过滤器。首先,通过网络交换大量数据将消耗不必要的带宽。其次,将所有数据导入JVM并对其进行处理将消耗更多内存。第三,可以针对复杂查询优化和优化数据库。与您的DBA交谈,给他查询并让他运行分析。该分析将告诉您是否需要添加任何索引来优化查询。

此外,与您的看法相反,我的经验表明,如果查询在SIT中花费70-90秒,那么在生产中将花费更多时间。因为尽管PROD机器更快,但是PROD中的数据量比SIT高得多,因此将花费更长的时间。但这并不意味着您应该在网络上拖拉它并在JVM中对其进行处理。另外,与数据库内存相比,JVM的堆内存要少得多。

此外,随着我​​们转向支持云的容器化应用程序体系结构,网络带宽需要收费。例如。如果您的应用程序在云中,而数据库在内部,则想象一下您要来回移动的数据量,以最终从一百万行中筛选出10行。

我建议您编写一个好的查询,对其进行优化并仅在数据库端处理尽可能多的条件。希望对您有帮助!

答案 1 :(得分:1)

通常,将尽可能多的处理推送到数据库是一个好主意。即使它实际上可能是一个瓶颈,它通常也经过了很好的优化,并且可以比您更快地处理大量数据。

对于您正在描述的读取查询,您甚至可以卸载工作以读取副本,因此不会使主数据库不堪重负。