这更像是一个设计问题,但也与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”但似乎根本没有效果。有没有更好的设计来改善这个过程的性能?
答案 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)