如何解决慢速运行SQL查询

时间:2014-06-20 09:10:26

标签: sql sql-server tsql

我遇到运行缓慢查询的问题。 我用sql server profiler分析了查询,但我似乎无法找到一个好的解决方案。 我确实找到了为什么它运行缓慢。如果询问完整的数据集,它会在10秒内返回150行,如果我添加了总和和计算,则返回18行,但需要8分钟。

在sql server profiler中,我发现完整的数据集执行大约1 000 000次读取,总计查询大约为82 000 000.但我不知道他是如何或为何获得了许多记录。因为完整数据集是总和查询中的子选择。

下面的查询是一个例子而不是真正的查询(真正的查询在子查询中也有联合所有,但总和查询基本相同)

SELECT Sum(x) * 0.1,
       Sum(y),
       a
FROM   (SELECT x,
               y
        FROM   tx
        INNER JOIN ty ON tx.a = ty.a 
        WHERE  x = 1 --this returns 150 rows in 10s 
       ) sub 
GROUP  BY a -- sum returns 18row 8min 

有人可以帮助我做一些我必须做的测试或者可以测试的解决方案吗? First Piece execute plan Second Piece Third Piece

2 个答案:

答案 0 :(得分:0)

尝试使用临时表将查询分解为2个步骤以删除子查询:

-- populate temp table
SELECT x, y, a
INTO #TEMP
FROM   tx INNER JOIN ty ON tx.a = ty.a 
WHERE  x = 1

-- query the temp table
SELECT Sum(x) * 0.1,
       Sum(y),
       a
FROM #TEMP
GROUP BY a

答案 1 :(得分:0)

我建议两次进行聚合。在你的例子中,这看起来有点不合情理,但结构是:

SELECT sum(x), sum(y)
       Sum(y),
       a
FROM   (SELECT a, sum(x) * 0.1 as x, sum(y) as y
        FROM tx INNER JOIN
             ty
             ON tx.a = ty.a 
        WHERE  x = 1 --this returns 150 rows in 10s 
        GROUP BY a
       ) sub 
GROUP  BY a ;

SQL应该更好地在各个表上进行聚合,将结果与重新聚合相结合,而不是在单个表的union上进行聚合。另外,如果您使用的是union而不是union all,则会影响效果。