这更像是一个设计问题,但也与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来说很容易优化。因此,我们解决了一部分问题,并以可优化的方式解决了问题。

然后,我们通过联接到子查询来重复此技巧,将过滤器放在子查询中,以便联接充当过滤器。

10-07 13:43
查看更多