查询中的SQL是性能更好,还是Java方法包含SQL
我有一个场景,在这个场景中,用户将选择高达100K条目的大量输入,我需要验证此数据是否属于用户,是否满足其他X条件,因此我应该使用复杂的Oracle SQL DB查询-复合INid列来验证它,还是 我是否应该先获取此用户的所有数据以及此特定用户的所有其他条件,并将其填充到dbList中,然后验证dbList.CONTAINSALLIPUTLIST,从而将满足条件的此用户的数据提取到应用程序内存并使用List.containsAll 哪一个性能更好。DB Composite IN发送批量输入vs获取输入并使用containsAll进行验证 我尝试在SIT环境中运行SQL查询,查询大约需要70-90秒,这太糟糕了。在prod中会更好,但我仍然觉得数据必须在DB中对大量数据进行排序,即使它是由用户ID索引的 在DB中,我使用Count*,如下所示:查询中的SQL是性能更好,还是Java方法包含SQL,java,sql,Java,Sql,我有一个场景,在这个场景中,用户将选择高达100K条目的大量输入,我需要验证此数据是否属于用户,是否满足其他X条件,因此我应该使用复杂的Oracle SQL DB查询-复合INid列来验证它,还是 我是否应该先获取此用户的所有数据以及此特定用户的所有其他条件,并将其填充到dbList中,然后验证dbList.CONTAINSALLIPUTLIST,从而将满足条件的此用户的数据提取到应用程序内存并使用List.containsAll 哪一个性能更好。DB Composite IN发送批量输入vs获
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
);
此外,还有其他条件,用于验证用户输入是否有效
示例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";
在较低的环境中,使用composite-IN条件的SQL查询大约需要70-90秒,但是containsALL的Java代码看起来要快得多
顺便说一句,我不想使用temp table并执行该过程,因为DB中的批量输入条目也是一件麻烦事。我使用的是ATG框架,模块是RESTful的,因此性能在这里是最重要的。我个人认为,您应该在数据库端应用所有过滤器,原因有很多。首先,通过网络交换那么多数据将消耗不必要的带宽。其次,将所有这些数据引入JVM并对其进行处理将消耗更多内存。第三,可以针对复杂查询对数据库进行调优和优化。与DBA交谈,向他提供查询并让他运行分析。分析将告诉您是否需要添加任何索引以优化查询 另外,与您的想法相反,我的经验表明,如果查询在SIT中需要70-90秒,那么在prod中需要更多的时间。因为虽然prod机器要快得多,但prod中的数据量要比SIT高得多,因此需要更长的时间。但这并不意味着您应该通过网络将其传输到JVM中进行处理。另外,JVM堆内存比数据库内存少得多 此外,随着我们转向支持云的、容器化的应用程序体系结构,网络带宽也要收费。例如,如果你的应用程序在云中,而数据库在本地,想象一下你将来回移动的数据量,最终从一百万行中过滤出10行
我建议您编写一个好的查询,对其进行优化,并仅在数据库端处理尽可能多的条件。希望有帮助 一般来说,将尽可能多的处理推送到数据库是个好主意。尽管它实际上可能像一个瓶颈,但它通常经过了很好的优化,可以比您更快地处理大量数据
对于您正在描述的读取查询,您甚至可以卸载读取副本的工作,这样就不会让主控器不知所措。如何从用户输入中获取内容?@scaisEdge:从用户输入中。@Mir 100K表单用户输入?更好地解释我不明白。。您真正使用的是哪个数据库??有些数据库在内容维度Oracle sql中有一个限制,我在查询60k记录时尝试了sql Composite,它的限制是100k。这些数据可以用于用户选择UI标志select all的场景,我可以通过获取给定select all的参数并从DB中筛选来处理这些数据,然后取消检查很少,输入可能相当大。