Java 更改查询设计以提高性能

Java 更改查询设计以提高性能,java,sql-server,performance,Java,Sql Server,Performance,这更像是一个设计问题,但也与SQL优化有关 我的项目必须将大量记录导入数据库,超过100k条记录。同时,项目具有检查每个记录的逻辑,以确保它符合可配置的标准。然后,它会将记录标记为无警告或数据库中有警告。插入和警告检查在一个导入过程中完成 对于每个条件,它必须查询数据库。查询需要连接其他两个表,有时还需要在条件中添加其他嵌套查询,例如 select * from TableA a join TableB on ... join TableC on ... where (sele

这更像是一个设计问题,但也与SQL优化有关

我的项目必须将大量记录导入数据库,超过100k条记录。同时,项目具有检查每个记录的逻辑,以确保它符合可配置的标准。然后,它会将记录标记为无警告或数据库中有警告。插入和警告检查在一个导入过程中完成

对于每个条件,它必须查询数据库。查询需要连接其他两个表,有时还需要在条件中添加其他嵌套查询,例如

select * from TableA a 
  join TableB on ... 
  join TableC on ... 
where
  (select count(*) from TableA 
where TableA.Field = Bla) > 100
虽然查询需要花费不明显的时间,但查询整个记录集需要相当长的时间,在服务器上可能需要4-5个小时。特别是如果有许多条件,项目最后将停止运行导入和回滚


我尝试将SELECT*FROM更改为SELECT TableA.ID FROM,但似乎没有任何效果。是否有更好的设计来提高此过程的性能?

制作一个临时表或多个临时表来存储子查询的聚合结果,然后使用覆盖索引索引这些临时表

根据上面的代码,我们将在TableA.Field1上创建一个临时表分组,包括一个计数,然后在Field1上创建索引,count。在SQL server上,最快的方法是:

select * from TableA a 
  join TableB on ... 
  join TableC on ... 
  join (select Field1 from #temp1 where theCount > 100) t on...
这样做之所以有效,是因为我们两次都在做同样的把戏

首先,我们预先聚合到临时表中,这是一个简单的操作,SQL Server很容易进行优化。因此,我们从问题中挑选了一部分,并以一种可优化的方式加以解决


然后我们重复这个技巧,加入子查询,将筛选器放入子查询中,以便联接充当筛选器。

我建议您一次将500个左右的记录批处理在一起,并将其发送到可以进行计算的存储过程


在那里使用简单语句而不是连接。这也节省了成本。这可能也有帮助。

使用索引视图是一个不错的选择。

我应该在哪里制作临时表?从TableA中选择计数*,其中TableA.Field1=Bla和TableA.Field2=Blaa和。。。查询也来自数据库,所以我必须先找到一种方法将其转换为临时表。我假设您正在分阶段执行此操作。首先,将100k行加载到收件箱表或暂存表中。接下来,您将通过一个或多个步骤从该表中取出数据,以将数据获取到其最终目的地。因此,可以在存储过程或应用程序代码中创建临时表。