日期:2014-05-17  浏览次数:20611 次

sql server大数据多表链接查询效率问题
问题是这样的:
    一条查询语句大概链接了20来个表,其中LEFT的表查询了特别慢。现在我将几个INNER的表先查询出来例如
(Select a.name,a.code,b.dept,b.orgid from user a inner org b on a.orgid=b.orgid) temp
然后把其他的left表也类似几个分一个表再用temp链接其他的表发现突然执行效率快了很多,之前大概要10多秒的现在5秒不到出来了。不知道是什么机制造成的,根据测试发现,有一段left特别影响效率,但那张表才300多行数据,加减前后差了6-8秒。

公司数据量以每天50万+条增加。在写复杂的多表查询时需要注意些什么?有一次写了一个查询在不添加条件情况下数据库报tempdb溢出,后来是通过重新拆表解决的,有没有更好的方法可以解决类似问题?
sqlServer效率

------解决方案--------------------
left join会带来很多“额外”的数据,不过要看业务,有些业务必须带出来。另外一个查询如果涉及20个表,应该考虑重新审视其合理性,核心思想其实就是尽快减少需要关联和处理的数据量
------解决方案--------------------
我设计过一个系统,当时考虑的是书上说的至少满足三范式,结果出来查询语句一大堆,性能什么的你怎么优化都没得用。最后迫不得已改设计。有些时候适当的冗余数据是对系统的性能有提高的。
------解决方案--------------------
一般建议一个查询中关联的表不超过5个,关联的表太多会使得SQL引擎无法得出最优的执行计划.
------解决方案--------------------
我之前那个公司写的报表,也是有一堆表关联,没你20表那么多,但是也有15-16个表的关联,速度非常慢。

而且最夸张的是,像你说的,有些表数据不多,才1000多条,但就是速度非常慢,5分钟还出不了。

后来,通过把一个超大的查询,一般都有个几百行,拆分成多个小的查询,然后每个小的查询把结果select * into #temp,到临时表。

然后最后,把这些5-6个临时表,在进行关联,这样的效率就高多了,基本上10秒内就能返回结果,另外,查询的稳定性比较高,不会一会快,一会慢的。

但这样用的tempdb的空间就多了,所以需要加强对tempdb数据库的监控