2015-03-24 1 views
0

Есть ли у кого-нибудь предложения по повышению эффективности следующего оператора выбора? Это очень простой запрос, но SSRS, использующий код, попадает в таймаут.SQL Server 2012 - Оптимизация SQL-запроса с функциями в операторе select

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 использует.

+0

Есть ли у вас индексы An_ID в обоих TableA и TableB? Также должно быть предложение GROUP BY где-то там? –

+0

Да, оба имеют идентификаторы с индексами. – Keni

+0

Они покрывают индексы? –

ответ

1

Для этого запроса:

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 
Смежные вопросы