这更像是一个设计问题,但也与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”,但似乎根本没有任何效果。是否有更好的设计来改善此过程的性能?
最佳答案
如何制作一个临时表(或多个临时表)来存储子查询的汇总结果,然后用覆盖索引为该索引建立索引。
从上面的代码中,我们将在TableA.Field1上创建一个临时表分组,包括一个计数,然后在Field1 theCount上建立索引。在SQL Server上,最快的方法是:
select * from TableA a
join TableB on ...
join TableC on ...
join (select Field1 from #temp1 where theCount > 100) t on...
之所以起作用,是因为我们在做相同的技巧两次。
首先,我们预先聚合到临时表中,这是一个简单的操作,对于SQL Server来说很容易优化。因此,我们解决了一部分问题,并以可优化的方式解决了问题。
然后,我们通过联接到子查询来重复此技巧,将过滤器放在子查询中,以便联接充当过滤器。