首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改查询设计以提高性能

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

Stack Overflow用户
提问于 2011-05-09 10:54:52
回答 3查看 81关注 0票数 2

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

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

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

代码语言:javascript
复制
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”,但似乎没有任何效果。有没有更好的设计来提高这个过程的性能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-09 11:10:57

如何创建一个(或多个)临时表来存储子查询的聚合结果,然后使用覆盖索引对该表/那些表进行索引。

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

代码语言:javascript
复制
select * from TableA a 
  join TableB on ... 
  join TableC on ... 
  join (select Field1 from #temp1 where theCount > 100) t on...

这样做的原因是我们在做同样的把戏两次。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-09 11:21:58

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

在那里使用简单的语句而不是连接。这也节省了时间。这个link可能也会有帮助。

票数 0
EN

Stack Overflow用户

发布于 2011-05-09 14:01:11

最好的选择是使用索引视图。http://msdn.microsoft.com/en-us/library/dd171921(SQL.100).aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5932033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档