更改查询设计以提高性能

时间:2011-05-09 02:54:52

标签: java sql-server performance

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

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

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

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”但似乎根本没有效果。有没有更好的设计来改善这个过程的性能?

3 个答案:

答案 0 :(得分:1)

如何制作临时表(或多个)来存储子查询的聚合结果,然后将那些/那些覆盖索引编入索引。

从上面的代码中,我们在TableA.Field1上进行临时表分组并包括一个count,然后是Field1上的索引,theCount。在SQL服务器上,最快的方法是:

select * from TableA a 
  join TableB on ... 
  join TableC on ... 
  join (select Field1 from #temp1 where theCount > 100) t on...

这样做的原因是我们两次做同样的伎俩。

首先,我们预先聚合到临时表中,这是一个简单的操作,非常容易让SQL Server进行优化。所以我们采取了一个问题并以可优化的方式解决了。

然后我们通过连接子查询重复这个技巧,将过滤器放在子查询中,以便连接充当过滤器。

答案 1 :(得分:0)

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

使用简单语句而不是连接。这也节省了。这个link也可能会有所帮助。

答案 2 :(得分:0)