SQL Server 2012 - 使用 select 语句中的函数优化 SQL 查询
SQL Server 2012 - Optimizing SQL query with functions in select statement
有人对提高以下 select 语句的效率有什么建议吗?这是一个非常简单的查询,但是使用该代码的 SSRS 达到了超时设置。
SELECT
G.A
,B = IsNull(Avg(CAST(T.B as decimal)), 0)
,C = Sum(T.C)
,D = IsNull(Avg(CAST(T.D as decimal)), 0)
FROM
TableA as G
INNER JOIN
TableB as T ON T.An_ID = G.An_ID
group by G.A
这是 SSRS 使用的 SP 的较大脚本中具有相同分组的代码片段。
对于此查询:
SELECT G.A, B = IsNull(Avg(CAST(T.B as decimal)), 0),
C = Sum(T.C), D = IsNull(Avg(CAST(T.D as decimal)), 0)
FROM TableA G INNER JOIN
TableB T
ON T.An_ID = G.An_ID
GROUP BY G.A;
您需要 TableB(An_ID)
和 TableA(An_Id, A)
上的索引。
我的猜测是连接产生了大量的中间行。您可以通过以下方式获得计数:
select sum(a.cnt * b.cnt)
from (select an_id, count(*) as cnt from tablea group by an_id) a join
(select an_id, count(*) as cnt from tableb group by an_id) b
on a.an_id = b.an_id;
你可以找到进攻组合:
select top 100 a.cnt * b.cnt, a.an_id
from (select an_id, count(*) as cnt from tablea group by an_id) a join
(select an_id, count(*) as cnt from tableb group by an_id) b
on a.an_id = b.an_id
order by a.cnt * b.cnt desc
有人对提高以下 select 语句的效率有什么建议吗?这是一个非常简单的查询,但是使用该代码的 SSRS 达到了超时设置。
SELECT
G.A
,B = IsNull(Avg(CAST(T.B as decimal)), 0)
,C = Sum(T.C)
,D = IsNull(Avg(CAST(T.D as decimal)), 0)
FROM
TableA as G
INNER JOIN
TableB as T ON T.An_ID = G.An_ID
group by G.A
这是 SSRS 使用的 SP 的较大脚本中具有相同分组的代码片段。
对于此查询:
SELECT G.A, B = IsNull(Avg(CAST(T.B as decimal)), 0),
C = Sum(T.C), D = IsNull(Avg(CAST(T.D as decimal)), 0)
FROM TableA G INNER JOIN
TableB T
ON T.An_ID = G.An_ID
GROUP BY G.A;
您需要 TableB(An_ID)
和 TableA(An_Id, A)
上的索引。
我的猜测是连接产生了大量的中间行。您可以通过以下方式获得计数:
select sum(a.cnt * b.cnt)
from (select an_id, count(*) as cnt from tablea group by an_id) a join
(select an_id, count(*) as cnt from tableb group by an_id) b
on a.an_id = b.an_id;
你可以找到进攻组合:
select top 100 a.cnt * b.cnt, a.an_id
from (select an_id, count(*) as cnt from tablea group by an_id) a join
(select an_id, count(*) as cnt from tableb group by an_id) b
on a.an_id = b.an_id
order by a.cnt * b.cnt desc