我遇到运行缓慢查询的问题。 我用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
答案 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
,则会影响效果。